grep :использовать квадратные скобки для соответствия определенным символам

Хорошо, решение нашел сам.

Опция

--абсолютных -имен должна использоваться ОБА при создании архива, а также при его распаковке. Работает идеально. Спасибо, в любом случае!

1
22.01.2021, 15:52
1 ответ

Поскольку регулярное выражение, которое вы хотите передать в grep, не заключено в кавычки, оно захватывается оболочкой и пытается расширить его до вызова grep. Теперь регулярное выражение, которое вы использовали, также является допустимым шаблоном оболочки 1 , что означает «перечислить все файлы или каталоги в текущей папке, имя которой состоит из любых двух символов, за которыми следует строка o.txt". Если ваш текущий каталог содержит какие-либо файлы или подкаталоги, соответствующие этому глобусу, то глобус будет расширен до соответствующих имён файлов :

.
$ ls
abo.txt  demo.txt

$ cat demo.txt
foo.txt

$ set -x
$ grep [a-z][a-z]o.txt demo.txt 
+zsh:7> grep abo.txt demo.txt

set -xуказывает zshпоказывать фактически выполняемые команды. Как видите, [a-z][a-z]o.txtрасширяется до соответствующего имени файла :abo.txt, а , что , передается в grep.

На самом деле у вас не было подходящих имен файлов в вашем каталоге, что означает, что zshрасширил шаблон до пустой строки и даже не запустил grepвообще. Вот почему ошибка zsh: no matches found: [a-z][a-z]o.txt. Это означает, что zsh сообщает вам, что ему не удалось расширить глобус до каких-либо соответствующих файлов.

И, наконец, вот что происходит, если правильно цитировать шаблон:

$ grep '[a-z][a-z]o.txt' demo.txt 
+zsh:12> grep '[a-z][a-z]o.txt' demo.txt
foo.txt

На этот раз кавычки защищали шаблон от оболочки, которая передала его как есть в grepи grep, в свою очередь, интерпретировала его как регулярное выражение, означающее «любые две строчные буквы, затем o, затем любой другой символ и заканчивается txt". Это важная деталь, поскольку .в регулярном выражении означает «любой символ». Так что вы действительно хотели:

grep '[a-z][a-z]o\.txt' demo.txt 

\.«убегает» от ., так что он соответствует только буквальной точке и больше не означает «любой символ». Так что всегда цитируйте свои регулярные выражения и будьте осторожны с .!

Наконец, вот альтернативный способ записи с использованием расширенных регулярных выражений:

$ grep -E '[a-z]{2}o\.txt' demo.txt      
foo.txt

1См. Каково определение регулярного выражения?для более подробной информации о подстановках и регулярных выражениях.

12
18.03.2021, 22:35

Теги

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