zip выводит в неправильном месте при использовании в цикле

(?!...)— это perlоператор регулярного выражения, а awkрегулярные выражения — это вариант расширенных регулярных выражений POSIX (ERE ).

(?!...)не является несовместимым с ERE, поскольку (?не указан в ERE, поэтому реализации awkмогут выбрать реализацию этого оператора, поскольку он не повлияет на переносимые приложения, которые не могут его использовать.

Но хотя существуют некоторые egrep/grep -Eреализации, такие как ast -open, которые его поддерживают, я не знаю ни одной awkреализации, которая (работает на основании сообщения об ошибке, вашего по-видимому, основан на оригинальной реализации Брайана Кернигана, которая может даже не поддерживать {x,y}интервальные операторы ).awk не может использовать PCRE (переносимый perl -совместимые библиотеки регулярных выражений ), поскольку регулярные выражения perl в целом несовместимы с awkREs (, например, для поведения оператора чередования, или \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+'
2
16.04.2021, 19:03
1 ответ

Вы можете увидеть это в своем выводе:

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
3
28.04.2021, 22:52

Теги

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