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
정규식 연산자이고 regexps awk
는 POSIX 확장 정규식(ERE)의 변형입니다.
(?!...)
(?
ERE에 지정되지 않았기 때문에 ERE와 호환되지 않습니다 . 따라서 awk
구현 시 이 연산자를 사용할 수 없는 이식 가능한 애플리케이션에 영향을 주지 않으므로 이 연산자를 구현하도록 선택할 수 있습니다.
egrep
그러나 이를 지원하는 일부 구현 (예: ast-open 구현)이 있지만 grep -E
나는 그런 것을 전혀 알지 못합니다 awk
(오류 메시지에 따르면 귀하의 구현은 Brian Kernighan의 원래 구현을 기반으로 한 것으로 보입니다. 간격을 지원하지 않을 수도 있습니다 {x,y}
) 비즈니스를 운영합니다). awk는 Perl 정규식 전체가 RE와 호환되지 않기 때문에 PCRE(이식 가능한 Perl 호환 정규식 라이브러리)를 사용할 수 없습니다 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+'