2012-03-12 105 views
0

超過一個字不工作時,我在這裏看到一個文件:awk的tolower函數會匹配每行

$更多的myfile.txt

傑克和吉爾上山。

我的問題是,爲什麼tolower的()不應用到第二個字, '吉爾',在這種情況下:

$ AWK「tolower的($ 0)〜/插孔/ & & /吉爾/ {打印FILENAME「:」$ 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. 

高於

&& 
    Logical 「and」. 

您可以將命令改爲

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

有趣。這似乎工作,謝謝!但爲什麼我必須不斷地爲每個單詞添加tolower()?你知道是否有一個簡單的方法來迫使$ 0在awk期間小寫嗎? – fooledbyprimes 2012-03-12 03:09:54

+0

'awk'{$ 0 = tolower($ 0)}; ...'' – kev 2012-03-12 03:16:18

+1

或'awk -vIGNORECASE = 1'...'' – kev 2012-03-12 03:17:46

0

這可能會爲你(gawk的工作,併爲@kev已經寫在他的評論):

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

N.B.

  • IGNORECASE設置爲非零使得所有字符串模式和regexp的情況無關。
  • tolower()返回複製,與它的相應的小寫字符替換串中的每個大寫字符。

編輯:

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

感謝您的提示。我試圖用awk作爲最低的共同標準,因爲我需要它能夠在幾個版本的linux上工作,而且我不知道哪個版本會有gawk。 – fooledbyprimes 2012-03-13 00:53:06

+0

第二種解決方案應適用於所有變體。但它可能會混淆空白。 – potong 2012-03-13 01:03:05