7

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

输入文件:

boy
boy
girl
boy

输出文件:

boy
boy
girl
boys
4

3 回答 3

12

一种方法是反转文件,仅替换第一个匹配项,然后再次反转它。

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

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

于 2013-08-17T17:34:46.883 回答
5

您只需要$

sed '$s/boy/boys/'
于 2013-08-18T03:26:18.347 回答
4

这可能对您有用(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

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

于 2013-08-18T08:12:54.860 回答