awk에서 대소문자를 구분하지 않는 검색

awk에서 대소문자를 구분하지 않는 검색

awk를 사용하여 키워드를 검색해야 하는데 대소문자를 구분하지 않고(대소문자 구분 안 함) 검색을 수행하고 싶습니다.

내 생각에 가장 좋은 방법은 검색어("키워드")와 awk가 동시에 읽는 대상 행을 모두 대문자로 사용하는 것입니다. ~에서이 문제모두 대문자로 인쇄를 어떻게 사용할 수 있지만 toupper해당 답변은 인쇄만 표시하고 변수에 대문자 텍스트를 남기지 않기 때문에 일치에 사용하는 방법을 모르겠습니다.

다음은 다음 입력이 주어진 예입니다.

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

나는 다음과 같은 출력을 원합니다.

I want all 
these text and numbers 123
and chars !"£$%&
as output

이것이 내가 가지고 있는 것이지만 추가하는 방법을 모르겠습니다 toupper.

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt

답변1

표현식을 /&&&key word&&&/패턴과 일치시키기 위해 현재 행을 명시적으로 사용하는 다른 표현식으로 바꾸십시오(예:).$0

tolower($0) ~ /&&&key word&&&/

또는

toupper($0) ~ /&&&KEY WORD&&&/

그래서 당신은

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

$0변수는 기본적으로 초기화되거나 처음 사용되며 아래 설명에서 언급된 기본 동작이므로 BEGIN 블록을 제거할 수 있기 ""때문에 0작은 {print}따옴표 가 필요합니다.

답변2

gawk에는 IGNORECASE0이 아닌 값으로 설정하면 모든 문자열 및 정규식 비교에서 대소문자를 구분하지 않는 내장 변수가 있습니다. 당신은 그것을 사용할 수 있습니다 :

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

이것은 구체적이지만 gawkmeuh(더 이식성이 뛰어난) 대안보다 더 읽기 쉽다고 생각합니다. 물론 이것이 문제인지 여부는 전적으로 귀하에게 달려 있습니다.

관련 정보