(?!...)
— это perl
оператор регулярного выражения, а awk
регулярные выражения — это вариант расширенных регулярных выражений POSIX (ERE ).
(?!...)
не является несовместимым с ERE, поскольку (?
не указан в ERE, поэтому реализации awk
могут выбрать реализацию этого оператора, поскольку он не повлияет на переносимые приложения, которые не могут его использовать.
Но хотя существуют некоторые egrep
/grep -E
реализации, такие как ast -open, которые его поддерживают, я не знаю ни одной awk
реализации, которая (работает на основании сообщения об ошибке, вашего по-видимому, основан на оригинальной реализации Брайана Кернигана, которая может даже не поддерживать {x,y}
интервальные операторы ).awk не может использовать PCRE (переносимый perl -совместимые библиотеки регулярных выражений ), поскольку регулярные выражения perl в целом несовместимы с awk
REs (, например, для поведения оператора чередования, или \b
, что означает что-то другое в perl
и awk
).
Здесь вы можете использовать perl
вместо:
perl -lae 'print $F[0] if /vault-(?!etcd|operator)/'
Или вы можете использовать grep
с -o
и поддержкой PCRE, например pcregrep
или GNU grep
с опцией -P
:
grep -Po '^\s*+\K(?=.*vault-(?!etcd|operator))\S+'
Вы можете увидеть это в своем выводе:
for dir in */; do
for> echo "$dir";
for> zip -r "$dir.zip" "$dir";
for> done
one/
[... ]
Поскольку вы выполняете for dir in */
, переменная включает косую черту в конце. Итак, ваш $dir
не one
, а one/
. Следовательно, когда вы запускаете zip -r "$dir.zip" "$dir";
, вы запускаете это:
zip -r "one/.zip" "one";
Итак, zip
делает именно то, что вы ему говорите. Вместо этого я думаю, что вы хотите что-то вроде этого:
$ for dir in */; do dir=${dir%/}; echo zip -r "$dir.zip" "$dir"; done
zip -r one.zip one
zip -r three.zip three
zip -r two.zip two