Хорошо, решение нашел сам.
Опция--абсолютных -имен должна использоваться ОБА при создании архива, а также при его распаковке. Работает идеально. Спасибо, в любом случае!
Поскольку регулярное выражение, которое вы хотите передать в 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См. Каково определение регулярного выражения?для более подробной информации о подстановках и регулярных выражениях.