#regex #bash #shell #directory #find
#регулярное выражение #удар #оболочка #каталог #Найти #bash
Вопрос:
Я должен получить содержимое всех имен файлов, соответствующих шаблону (включить «a» или «A», появляющиеся не менее 3 раз, их не обязательно устанавливать подряд, между ними могут быть пробелы или другие буквы или символы) Я не могу понять, почему мое регулярное выражение там не работает. Если я запущу скрипт, вывода не будет.
Давайте, например, поищем файл с именем «Alabama», поскольку мы видим, что он соответствует указанному шаблону.
Пробовал -регулярное выражение здесь:
find . -type f -regex '([^a]*a){3}' -exec cat {} ;
Пробовал -имя тоже:
find . -type f -name '([^a]*a){3}' -exec cat {} ;
Но ничего из этого не работает. Если я вставлю обычную строку в
find . -type f -name 'string' -exec cat {} ;
Он обычно работает и отображает содержимое файла с именем ‘string’.
Есть какие-нибудь советы, как заставить это работать и найти правильные файлы, соответствующие шаблону? Является ли шаблон неправильным? (Я только изучаю bash, так что любые советы приветствуются)
Комментарии:
1.
-regex '.*/([^a]*a){3}.*'
2. Пробовал использовать этот шаблон регулярных выражений, и он по-прежнему не находит файл, который ему соответствует. Как вы думаете, это правильно? @Wiktor find . -введите f -regex ‘.*/([^a]*a){3}.*’ — exec cat {} ;
3.
cat *[aA]*[aA]*[aA]*
?4. На самом деле команда cat — это все, что мне было нужно! Это работает отлично, регулярное выражение тоже @Shawn Спасибо 🙂
Ответ №1:
Если целью упражнения не является использование регулярных выражений (Или find
), это можно сделать с помощью простого старого шаблона подстановки:
cat *[aA]*[aA]*[aA]*
Ответ №2:
Для полноты картины, первоначальная попытка не сработала, потому что механизм регулярных выражений по умолчанию find
не поддерживает {}
оператор. Изменение движка на grep (должен избегать круглых скобок) и учет символов после последнего a
:
find . -type f -regextype grep -regex '(.*[aA]){3}.*'
Или, поскольку все, о чем вы заботитесь, это 3 a
с:
find . -type f -regex '.*[aA].*[aA].*[aA].*'