2012-03-12 3 views
0

당 두 개 이상의 단어를 일치시킬 때 작동하지 ToLower 함수 awk가.내가 여기에 본 파일이 라인

내 질문은 왜()이 경우, 두 번째 단어, '질'에 적용되지 않습니다 tolower를 :

$의 AWK 'tolower를 ($ 0) ~/잭/& &/질/{인쇄 파일 이름 ":"$ 0; } '* .txt

다음 작업은 모두 소문자로 유지하려고합니다.

$ awk 'tolower ($ 0) ~/jack/{print FILENAME ":"$ 0; } '* .txt

myfile.txt : 잭과 질이 언덕 위로 올라갔습니다.

$ awk 'tolower ($ 0) ~/jill/{print FILENAME ":"$ 0; } '* .txt

myfile.txt : 잭과 질이 언덕 위로 올라갔습니다.

$ awk 'tolower ($ 0) ~/jack/& &/Jill/{print FILENAME ":"$ 0; } '* .txt

myfile.txt : 잭과 질이 언덕 위로 올라갔습니다.

감사합니다.

답변

3

Operator precedence은 다른 연산자가 한 표현식에 가까이있을 때 연산자를 그룹화하는 방법을 결정합니다.

~ !~ 
    Matching, nonmatching. 

당신이 당신 (둔한을 위해 작동 할 수

awk 'tolower($0) ~ /jack/ && tolower($0) ~ /Jill/{ print FILENAME ":" $0; }' *.txt 
+0

흥미 롭. 그것은 작동하는 것, 감사합니다! 하지만 왜 각 단어에 tolower()를 계속 추가해야합니까?awk의 지속 기간 동안 $ 0을 소문자로 만드는 간단한 방법이 있는지 알고 계십니까? – fooledbyprimes

+0

awk ($ 0 = tolower ($ 0)}; ... '' – kev

+1

또는'awk -vIGNORECASE = 1 '...' ' – kev

0

에 명령을 변경하고 @kev 이미 자신의 의견에 기록 된 것처럼 이상

&& 
    Logical “and”. 

입니다) :

awk -vIGNORECASE=1 '/jack/ && /jill/{print FILENAME ":" tolower($0)}' *.txt 

N.B.

  • IGNORECASE이 0이 아닌 값으로 설정하면 모든 문자열 패턴이 만들어지며 regexp는 대소 문자 독립적입니다.
  • tolower(문자열)는 해당 소문자로 대체 문자열의 각 대문자로, 문자열 의 복사를 돌려줍니다.

편집 :

awk '{$0=tolower($0)};/jack/ && /jill/{print FILENAME ":" $0}' *.txt 
+0

팁 주셔서 감사합니다. 내가 리눅스의 여러 버전에서 작동하기 위해 그것을 필요하기 때문에 awk을 가장 낮은 공통 분모로 사용하려고 노력하고 있으며 어느 것이 gawk를 가질 지 모른다. – fooledbyprimes

+0

두 번째 솔루션은 모든 변형에 적용됩니다. 그러나 그것은 공백으로 엉망이 될 수 있습니다. – potong

관련 문제