특정 단어와 일치하지 않는 모든 문자열을 제공하는 awk 정규 표현식을 찾고 있습니다.
/^((?!word \+).)*/
Java에서는 작동하지만 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'
사실 몇 년 전에도 이 생각을 하다가 다시 생각났어요.내 기사부정적인 정규 표현식을 작성해야 할 때마다 어떻게 작성했는지 기억이 나지 않는다는 점을 인정해야 합니다.