Поиск строк с определенным количеством букв, расширений, включенных в 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 ответ:
Можно использовать следующее выражение:
^([^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