2013-08-17 44 views
5

我想sed只有最後一個匹配模式的文本文件。sed只有最後一個匹配模式

輸入文件:

boy 
boy 
girl 
boy 

輸出文件:

boy 
boy 
girl 
boys 
+1

http://stackoverflow.com/questions/17114807/sed-replace-last-line-matching-pattern –

回答

7

一種方法是扭轉文件,僅更換第一匹配,然後再返回扭轉它。

tac <file> | sed '1 s/boy/boys/' | tac | sponge <newfile> 

tac將「連接並反向打印文件」。海綿將「吸收標準輸入並寫入文件」。它位於debian的「moreutils」包中。

+2

與'tac> newfile'相比,管道對'海綿'有什麼好處?如果數據很大,缺點是有一個額外的管道需要將數據複製進出,這會降低速度。 –

+0

當我想到這個問題時,我的手指就是這樣,真的。這不是一個強大的,多用途的解決方案,我會授予您的。 – chooban

6

所有你需要的是$

sed '$s/boy/boys/' 
+5

假設在最後一個「男孩」之後還有另一個「女孩」?這適用於特定示例數據,但不是更普遍。 –

0

這可能會爲你工作(GNU SED):

sed '1h;1!H;$!d;x;s/.*boy/&s/' file 

啜食文件到內存中,並替換使用貪婪所需的字符串中最後一次出現。

一種替代,更少的內存密集型解決方案:

sed '/.*boy/,$!b;//{x;//p;x;h};//!H;$!d;x;s//&s/' file 

它使用保留空間來保存包含所需的字符串,並揭示它們在遇到需要串的新occurence時以前行。在文件末尾,最後一次出現在保存空間中並被修改。