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


20

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

답변:


23

현재 줄을 /&&&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}아래 주석에서 언급 된대로 기본 조치입니다.


4
이를 단순화 할 수 awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt있습니다. BEGIN블록이 필요 없으며 기본 동작은 인쇄하는 것이므로 p;충분합니다.
terdon

1
BEGIN초기화되지 않은 변수는 false로 평가되므로 "블록이 필요하지 않습니다 ".
glenn jackman

최적화 주셔서 감사합니다. 나는 일반적으로 원본에 대한 최소한의 변경으로 답장을 제한하려고 시도하지만 새로운 결과가 훨씬 더 타이트하고 읽기 쉽습니다.
meuh

2
참고 사항 : tolower고대 (또는 고대가 아닌) awk 버전 (예 : AIX) 시스템에 있지만 toupper항상 사용할 수있는 것은 아닙니다 ^^.
Olivier Dulac

16

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

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

gawk그러나 이것은에만 해당 되지만 meuh의 (보다 이식성이 좋은) 대안보다 더 읽기 쉽습니다. 그것이 문제인지 여부는 물론 전적으로 귀하에게 달려 있습니다.


1
나는 가장 큰 gawk 프로젝트 중 하나에서 수년간 awk를 지원하고 싶었지만 대소 문자를 구분하지 않는 검색 트리거가 없기 때문에 gawk는 대소 문자를 구분하지 않는 검색 횟수로 인해 시작하지 않았습니다. gensub는 awk에서 대체하기 어려운 다른 gawk 전용 기능입니다. 그러나 gawk는 기본적으로 일부 컴퓨터 및 배포판에 기본적으로 설치되는 것은 아니지만 거의 항상 사용 가능하지만 2016 년까지 표준 도구의 기능을 약간 확장하기 위해 awk 및 posix를 변경할 수 없었습니다.
Lizardx

3
@ Lizardx : 그것은 확장하지 않는 요점입니다. 표준으로 유지하십시오. 그렇지 않으면 다른 표준을 만든 다음 표준간에 비 호환성이 있습니다 (그러면 표준 변경을 최소로 유지하려고 시도합니다. 그럼에도 불구하고 여러 표준은 컴퓨팅의 주요 재앙 중 하나임)
Olivier Dulac

2
동의하지 않습니다. 신중하게 실행하면 모든 레거시 방법을 지원하면서 확장을 도입 할 수 있습니다. 그렇게하지 않으면 시간이 지남에 따라 관련성이 사라지기 시작합니다. 컴퓨팅의 모든 것이 발전함에 따라 트릭은 매우 안정적인 안정적인 진화를 유지하는 것입니다. Bash는 그렇게하는 좋은 예이며, 매우 안정적이며 단순히 새로운 기능을 추가하고, '두 가지 표준'이 아니며 지원되는 것을 사용하며, 변경 사항이 전 세계적으로 출시되면 새로운 기능을 사용할 수 있습니다. 가장 오래된 레거시 시스템은 지원하지 않습니다.
Lizardx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.