AWK의 역정규식?

AWK의 역정규식?

특정 단어가 포함된 줄을 필터링하려고 합니다. 정규식은 스크립트에 대한 명령줄 입력입니다.

$0 ~ regex {
//Do something.
}

입력 예는 다음과 같습니다.

**String** **number**
domain  1
domain  2
bla     3

따라서 위의 입력에서 사용자는 "domain"이라는 단어가 포함된 행을 필터링한다고 말할 수 있습니다.

내가 시도한 것:

regex = "\?\\!domain" 

(부정적 예측).

하지만 이 정규식은 모든 줄을 필터링합니다. "도메인"이라는 단어가 포함된 줄만이 아닙니다.

답변1

input다음을 포함하는 특정 입력 파일의 경우:

domain
demesne

다음을 포함하는 필터 라인 domain:

$ awk '/domain/ { print }' input
domain

행 필터링아니요포함하다 domain:

$ awk '!/domain/ {print }' input
demesne

필터링 기준대지전체 줄 대신 새로운 주어진 파일로 다음을 시도해 볼 수 있습니다 input.

example www.example.com
exemplar www.example.net

첫 번째 필드가 있는 행 필터링포함하다 example:

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

귀하의 질문에서는 $0첫 번째 필드 대신 전체 행을 사용하고 있습니다.

답변2

행을 필터링하는 더욱 유연하고 강력한 또 다른 방법은 다음과 같습니다 {next}.

  • 모든 줄을 인쇄하려면원하지 않는다주어진 와 일치하고 regex다음을 수행하십시오.
    awk '/regex/ {next} {print}' inputfile
    

이 방법을 사용하여 다음과 같이 특정 두 행 사이의 모든 행을 필터링할 수도 있습니다.

  • 모든 줄을 인쇄아니요줄 일치 regex1와 첫 번째 다음 줄 일치 사이에서 regex2다음을 수행합니다.

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    (제 기억이 맞다면) 이건 절대 아닙니다 awk '!/regex/'.

예를 들어 inputfile콘텐츠가 다음과 같은 경우:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

그러면 명령은 다음 awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfile을 인쇄합니다.

hello, here is my confidential information


This is the end of my message

답변3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

관련 정보