awk:正则表达式库中的非法主键 -(?!etcd|operator)

awk:正则表达式库中的非法主键 -(?!etcd|operator)

需要改进 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正则表达式运算符,而awkregexps 是 POSIX 扩展正则表达式 (ERE) 的变体。

(?!...)与 ERE 并不不兼容,因为(?ERE 中未指定,因此awk实现可以选择实现该运算符,因为它不会影响无法使用它的可移植应用程序。

但是,虽然有一些egrep/grep -E实现(例如 ast-open 的实现)确实支持它,但我不知道有任何awk实现(根据错误消息,您的实现似乎基于 Brian Kernighan 的原始实现,它甚至可能不支持间隔{x,y})运营商)。 awk 不能使用 PCRE(一个可移植的 Perl 兼容的正则表达式库),因为 Perl 正则表达式作为一个整体与 RE 不兼容awk(例如交替运算符的行为,或者在和\b中意味着不同的东西)。perlawk

在这里,您可以改用perl

perl -lae 'print $F[0] if /vault-(?!etcd|operator)/'

或者您可以使用grepwith-o和 PCRE 支持,例如pcregrep或 GNUgrep及其-P选项:

grep -Po '^\s*+\K(?=.*vault-(?!etcd|operator))\S+'

相关内容