2017-01-14 113 views
0

我是非常新的使用Linux和我試圖找到/替換我的文件中的一些文本。查找替換「./」。在awk

我已經成功地能夠找到和替換 「0/0」 使用GSUB:

awk '{gsub(/0\/0/,"0")}; 1' filename

但是,如果我試圖取代 「./」。使用相同的想法

awk '{gsub(/\.\/\./,"U")}; 1' filename

輸出被截斷,並且在第一位置停止「./」。在文件中。我知道 」。」是一個特殊的通配符,但我認爲在它前面加上「\」會抵消它。我已經搜索,但一直無法找到解釋爲什麼我使用的公式會截斷文件。

任何想法將不勝感激。謝謝。

+0

'awk'不是這種操作的最佳工具。如果允許你自己選擇,我建議使用'sed'。 – DyZ

+0

如果我做'echo「abc./.def」| awk'gsub(/\.//./,「U」)「它按預期工作。 – dawg

+0

http://stackoverflow.com/help/mcve – melpomene

回答

1

回想一下,一個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是你所擁有的。爲什麼它不能處理您的輸入數據可能與您輸入的數據有關。

1

您的awk腳本沒問題,您的輸入包含control-Ms,可能是由Windows程序創建的。您可以使用cat -v file查看它們,並使用dos2unix或類似命令將其刪除。