Grep исключают подстановочные знаки, не работающие

Я использую Ubuntu 14.04 LTS.

Я играю вокруг с grep, и я поразил проблему, передающую по каналу grep к ls. Все примеры ограничены текущим каталогом, нерекурсивным.

Если я хочу перечислить все файлы, содержащие цифру на их имя:

ls | grep [0-9]

Если я хочу перечислить все файлы, содержащие "d", "h", "m" как первая буква:

ls | grep ^[dhm]

Если я хочу перечислить все файлы, содержащие цифру как их первая буква:

ls | grep ^[0-9]

Однако, когда я пытаюсь использовать ! внутри [], ! не включен:

user@host:~$ ls | grep [0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

user@host:~$ ls | grep [!0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

То же подразумевает, пытаюсь ли я использовать его с ^

user@host:~$ ls | grep ^[0-9]
1.log
2.log
3.log

user@host:~$ ls | grep ^[!0-9]
1.log
2.log
3.log

Я провел несколько дней, читая другие сообщения, страницы справочника, статьи и т.д. относительно grep и подстановочных знаков, но я не могу понять это. Я попытался вставить их ' и ", объединение обоих подстановочных флагов (^ и !) в [[]] и т.д.

Ничто не показывает другой вывод что примеры выше.

Не показывайте мне решение. Объясните мои ошибки и позвольте мне понять это самостоятельно.

2
задан 5 January 2017 в 07:57

1 ответ

Маркер Regex в классе символов для отрицания ^, не !.

, Таким образом, Вам нужно:

ls | grep '^[^0-9]'

, Если Вы делаете ls | grep ^[!0-9], затем в [], !, рассматривается буквально, и 0-9 расширен обычным способом.

Также для этого вида тривиальных задач, используйте оболочку globbing, Regex немного слишком много для них, и также не анализируйте ls; Вы могли просто сделать:

ls [^[:digit:]]*
ls [![:digit:]]*

Примечание, что, bash поддержки и ^, и ! как маркер отрицания шаблона в классе символов, в то время как globbing.

, Если Вы не хотите зависеть от Вас locale:

ls [^[0-9]]*
ls [![0-9]]*
5
ответ дан 2 December 2019 в 01:56

Другие вопросы по тегам:

Похожие вопросы: