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
正規表現演算子であり、regexpsawk
はPOSIX拡張正規表現(ERE)のバリアントです。
(?!...)
(?
EREに指定されていないため、EREと互換性がありません。したがってawk
、実装はこの演算子を使用できない移植可能なアプリケーションに影響を与えないため、この演算子を実装することを選択できます。
egrep
しかし、これをサポートするいくつかの実装(ast-openの実装など)がありますが、grep -E
私はそのようなことをまったく知りませんawk
(エラーメッセージによると、あなたの実装はBrian Kernighanの元の実装に基づいているようです。間隔をサポートしていない可能性があります{x,y}
)ビジネスを運営する)。 awkはPerl正規表現全体がREと互換性がないため、移植可能なPerl互換正規表現ライブラリ(PCRE)を使用することはできませんawk
(交互演算子の動作やその他の\b
意味など)。perl
awk
ここでは代わりに使用できますperl
。
perl -lae 'print $F[0] if /vault-(?!etcd|operator)/'
または、PCREサポート(GNUや対応するオプションなど)をgrep
使用できます。-o
pcregrep
grep
-P
grep -Po '^\s*+\K(?=.*vault-(?!etcd|operator))\S+'