sed只有最后一个匹配模式

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

input文件:

 boy boy girl boy 

输出文件:

 boy boy girl boys 

所有你需要的是$

 sed '$s/boy/boys/' 

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

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

tac将“连接并打印文件反向”。 海绵将“吸收标准输入并写入文件”。 它在Debian的“moreutils”包里。

这可能适用于你(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 

这将使用保持空间来保存之前包含所需字符串的行,并在遇到所需字符串的新发生时将其舍弃。 在文件末尾,最后一次出现在保存空间中并被修改。