需要改进 awk 的正则表达式。它适用于 regex101。
/vault-(?!etcd|operator)/
应该只匹配:
vault-etcd-abc123
vault-operator-def456
vault-ghi789 <--
尝试过:
awk '/vault-(?!etcd|operator)/ {print $1;exit}'
awk: illegal primary in regular expression vault-(?!etcd|operator) at !etcd|operator)
我尝试转义一些特殊字符,例如|
,但它没有给出预期的结果。
答案1
(?!...)
是perl
正则表达式运算符,而awk
regexps 是 POSIX 扩展正则表达式 (ERE) 的变体。
(?!...)
与 ERE 并不不兼容,因为(?
ERE 中未指定,因此awk
实现可以选择实现该运算符,因为它不会影响无法使用它的可移植应用程序。
但是,虽然有一些egrep
/grep -E
实现(例如 ast-open 的实现)确实支持它,但我不知道有任何awk
实现(根据错误消息,您的实现似乎基于 Brian Kernighan 的原始实现,它甚至可能不支持间隔{x,y}
)运营商)。 awk 不能使用 PCRE(一个可移植的 Perl 兼容的正则表达式库),因为 Perl 正则表达式作为一个整体与 RE 不兼容awk
(例如交替运算符的行为,或者在和\b
中意味着不同的东西)。perl
awk
在这里,您可以改用perl
:
perl -lae 'print $F[0] if /vault-(?!etcd|operator)/'
或者您可以使用grep
with-o
和 PCRE 支持,例如pcregrep
或 GNUgrep
及其-P
选项:
grep -Po '^\s*+\K(?=.*vault-(?!etcd|operator))\S+'