我想sed
只是文本文件的最后一个匹配模式。
输入文件:
boy
boy
girl
boy
输出文件:
boy
boy
girl
boys
答案 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
这使用保留空间来保存包含所需字符串的前一行,并在遇到所需字符串的新出现时将其删除。在文件的最后,最后一次出现在保留空间中并被修改。