Поиск строк с определенным количеством букв, расширений, включенных в grep


Если я передам ls в grep, Как я смогу вернуть список файлов с условием, что они содержат только x букв, включая расширение?

Так, например, если ls дает мне:

abcde.jav a156e.exc test.c prog1.c qwert r.c 

И я ищу все файлы, которые содержат строго 5 букв, включая расширения:

a156e.exc test.c prog1.c qwert

Я пробовал:

ls | grep '^[a-z]${5}'
ls | grep "^[a-z]|[a-z]$"

И другие подобные вещи, но я, кажется, не могу этого понять. Кажется, что решение должно быть действительно простым, но я не могу понять его. Какой-нибудь помощь будет оценена по достоинству.

1 4

1 ответ:

Можно использовать следующее выражение:

Живой Пример

^([^a-z]*[a-z][^a-z]*){5}$

Пояснение:

  • ^ - якорь, обозначающий начало строки
  • ([^a-z]*[a-z][^a-z]*) - группа, которая соответствует одной букве между нулем или более нелуквенных символов
  • {5} - соответствует предыдущей группе 5 раз
  • $ - якорь, обозначающий конец строки.

Использование:

ls | grep -E '^([^a-z]*[a-z][^a-z]*){5}$'

Или без ls:

for f in *; do
  if [[ $f =~ ^([^a-z]*[a-z][^a-z]*){5}$ ]]
    then
      echo $f
  fi
done