仅选择最后一个匹配模式

时间:2013-08-17 17:08:50

标签: linux sed

我想sed只是文本文件的最后一个匹配模式。

输入文件:

boy
boy
girl
boy

输出文件:

boy
boy
girl
boys

3 个答案:

答案 0 :(得分:8)

一种方法是反转文件,只替换第一个匹配,然后再将其反转。

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

tac将“连接并反向打印文件”。海绵将“吸收标准输入并写入文件”。这是在debian的“moreutils”包中。

答案 1 :(得分:6)

您需要的只是$

sed '$s/boy/boys/'

答案 2 :(得分:1)

这可能适合你(GNU sed):

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

将文件粘贴到内存中,并使用greed替换最后一次出现的所需字符串。

替代的,内存不足的解决方案:

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

这使用保留空间来保存包含所需字符串的前一行,并在遇到所需字符串的新出现时将其删除。在文件的最后,最后一次出现在保留空间中并被修改。