2016-06-18 79 views
0

我想打開一個包含500個IP地址列表的文本文件。我想對其中一行進行以下更改並保存該文件。用awk或sed可以做到這一點嗎?awk替換文本文件中的一行並保存它

當前行:

100.72.78.46:1900

變化:

100.72.78.46:1800

+2

可能的複製[如何用sed替換整行?](http://stackoverflow.com/questions/8822097/how-to-replace-whole-line-with-sed) – hek2mgl

+0

答案是否有可能做到這一點與awk「有關操縱文本的問題是」是「。請閱讀[問]。 –

回答

0

可以實現與以下:

sed -ie 's/100.72.78.46:1900/100.72.78.46:1800/' file.txt 

i選項將更新原始文件,並且a備份文件將被創建。這將只編輯模式的第一次出現。如果要替換所有匹配的模式,但是添加g最後/

該解決方案後,(如上的評論點出)無法在其他許多情況下,如72100372578146:190032,這將轉化爲72100.72.78.46:180032

爲了避免這一點,你必須做一個精確匹配,也沒有對待.特殊字符(見here):

sed -ie 's/\<100\.72\.78\.46:1900\>/100.72.78.46:1800/g' file.txt 

注意\.\<...\>「字邊界「完全匹配的符號。這個解決方案在Linux機器上爲我工作,但不在MAC上。對於這一點,你將不得不使用一個稍微不同的語法(見here):

sed -ie 's/[[:<:]]100\.72\.78\.46:1900[[:>:]]/100.72.78.46:1800/g' file.txt 

其中[[:<:]]...[[:>:]]會給你確切的匹配。

最後,我也意識到,如果你有每行只有一個IP地址,你也可以使用特殊字符^$爲始和行末,防止錯誤的更換:

sed -ie 's/^100\.72\.78\.46:1900$/100.72.78.46:1800/g' file.txt 
+0

這會因各種輸入文件內容而失敗。例如它會將'72100372578146:190032'轉換爲'72100.72.78.46:180032'。找到/更改想要的文本總是很容易,但要找到/更改不想要的文本會更困難,並且只需輸入一些小的樣本輸入即可生成輸出結果的腳本是找到解決方案的起點,而不是終點。在發佈樣本輸入/輸出時,務必考慮一些您認爲可能難以處理且不希望發現/更改的案例,而不僅僅是一個晴天案例。 –

+1

是的,你是對的。我會編輯我的回覆,使其更具有普遍意義。謝謝! –

相關問題