Отображать содержимое всех файлов (из текущего каталога), имена которых содержат символы «a» или «A», появляющиеся не менее 3 раз

#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].*'