回想一下,一個awk
的基本輪廓是:
awk 'pattern { action }'
最常見的模式是對行數的正則表達式或測試:
awk '/FOO/ { do_something_with_a_line_with_FOO_in_it }'
awk 'FNR==10'
最後一個沒有行動,使默認爲打印該行。
但是返回值的函數也可用作模式。 gsub
是一個函數並返回替換的數量。
所以給出:
$ echo "$txt"
abc./.def line 1
ghk/lmn won't get printed
abc./.def abc./.def printed
只打印有一個成功的代換系,你可以這樣做:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U")'
abcUdef line 1
abcUdef abcUdef printed
,因爲你想運行你並不需要把gsub
到動作框它在每一行和返回告訴你發生了什麼事情。由於gsub
返回替換次數,所以成功匹配的行將被打印出來。
如果你想無論打印每行,如果有匹配:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U") || 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
或者,您可以使用函數與空模式的動作,然後一個1
一個空的動作:
$ echo "$txt" | awk '{gsub(/\.\/\./,"U")} 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
在任何一種情況下,1
作爲無動作模式打印行,無論是否存在匹配,並且gsub
進行替換(如果有)。
第二個awk
是你所擁有的。爲什麼它不能處理您的輸入數據可能與您輸入的數據有關。
'awk'不是這種操作的最佳工具。如果允許你自己選擇,我建議使用'sed'。 – DyZ
如果我做'echo「abc./.def」| awk'gsub(/\.//./,「U」)「它按預期工作。 – dawg
http://stackoverflow.com/help/mcve – melpomene