Я использую 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 и подстановочных знаков, но я не могу понять это. Я попытался вставить их '
и "
, объединение обоих подстановочных флагов (^
и !
) в [[]]
и т.д.
Ничто не показывает другой вывод что примеры выше.
Не показывайте мне решение. Объясните мои ошибки и позвольте мне понять это самостоятельно.
Маркер 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]]*