Перечислите файлы с буквой «l», которые имеют по крайней мере две гласные в оболочке Linux

#bash #shell #command-line-interface #ls

Вопрос:

Я застрял с этой проблемой:

Перечислите все файлы с ls, которые имеют по крайней мере две гласные в любой позиции и заканчиваются на .c, .h или .s

Я пришел с частичным решением : ls *{a,e,i,o,u}*.[chs]

Но, очевидно, это не соответствует требованиям проблемы, потому что в нем перечислены все файлы, в которых есть любое количество гласных, а не два или более.

Комментарии:

1. Я не думаю, что глобусы поддерживают это, я бы передал ls через egrep для фильтрации также с помощью регулярного выражения

2. Глобусы поддерживают (эквивалент) этого. Просто включите extglob , что в основном включено по умолчанию для интерактивных оболочек.

Ответ №1:

Я бы тоже использовал класс символов для гласных

 ls *[aeiou]*[aeiou]*.[chs]  

Использование расширения скобок также возможно, но некоторые файлы затем отображаются несколько раз:

 ls *{a,e,i,o,u}*{a,e,i,o,u}*.[chs]  

Комментарии:

1. Я предлагаю добавить shopt -s nullglob для вашей второй команды.

2. Имейте в виду, что фигурные скобки создают несколько шаблонов, которые затем необходимо расширить, а не являются частью одного шаблона. *{a,e,i,o,u}* , например, сокращенно *a* *e* *i* *o* *u* от .