AWK 부정 정규 표현식

AWK 부정 정규 표현식

특정 단어와 일치하지 않는 모든 문자열을 제공할 수 있는 awk 정규 표현식을 찾고 있습니다.

Java에서는 작동 /^((?!word \+).)*/ 하지만 AWK에서는 작동하지 않습니다.

컴파일 실패 오류가 발생합니다. 대괄호를 이스케이프 처리하면 컴파일 오류가 해결되지만 정규식 일치가 올바르지 않습니다.

누구든지 awk 정규 표현식에 도움을 줄 수 있다면 좋을 것입니다.

사용할 수 없습니다 string" !~ /regex/

string" ~ /regex/ 모든 문자열을 제외한 특정 문자열에 대해 정규식을 사용해야 합니다 .

포함된 문자열은 domain필터링되어야 합니다. 입력

This is domain test
This is do test
This is test

산출

This is do test
This is test

정규식에만 관련되어야 합니다. Awk 코드를 변경할 수 없습니다

AWK에서는string" ~ /regex/

따라서 이를 달성하기 위해 정규식만 전달할 수 있습니다.

답변1

Thomas Dickey의 답변은 영리하지만 이를 수행하는 올바른 방법이 있습니다.

awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF

This is do test
This is test

답변2

awk에서 이를 수행하는 방법은 원하는 것과 일치하는 패턴을 작성하는 것입니다.들어오지 못하게 하다, 그리고 그것을 만든다행동 next. 그러면 달성하려는 패턴이 부정되는 처리 라인이 남습니다.

이 같은:

/regex/{ next; }
{ print; }

또는 스크립트가 더 복잡하여 다음을 사용할 수 없는 경우 next:

<<<'the quick brown fox jumps over the lazy dog'$'\n''pack my box with five dozen liquor jugs' awk '
{ negate=0 }
/box/{ negate=1 }
negate==1 { gsub(/[aeiou]/, "%") }
negate==0 { gsub(/[aeiou]/, "#") }
{ print NR, $0; }
'

# output
1 th# q##ck br#wn f#x j#mps #v#r th# l#zy d#g
2 p%ck my b%x w%th f%v% d%z%n l%q%%r j%gs

답변3

당신이 진술했기 때문에"정규식만 사용해야 합니다. Awk 코드를 변경할 수 없습니다."이 시도:

"연산자 부정" 대신 "정규식 부정"을 수행할 수 있습니다.. 그냥 합격하시면 됩니다부정 기호!!/domain/awk 스크립트에 대한 정규식의 일부로 .

awk '{if ($0 ~ !/domain/) {print $0}}'

답변4

POSIX 확장 정규식을 사용하여 부정 패턴을 작성하는 것은 특히 까다롭습니다. domain모든 문자가 다른 문자열의 경우 다음을 시도해 볼 수 있습니다.

awk -v re="^([^d]|d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]\
*o(d*d[^do]|[^dm])|[^da])|[doma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom\
]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[^di])|[domai]*i(d*d[^do]|[d\
o]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[do\
ma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|\
[^dm])|[^da])|[^di])|[^dn]))*[domai]*\$" '$0 ~ re'

나는 몇 년 전에 그 생각을 하고 다시 돌아왔습니다.내 그 기사부정 정규 표현식을 작성해야 할 때마다, 어떻게 그렇게 했는지 기억이 나지 않는다는 점을 인정해야 합니다.

관련 정보