如何使用sed无需指定行号替换文件中最后一次出现的指定文本
替换文件中最后一次出现的bye的两种可行方案
方法1:tac + sed 组合(逻辑简单易理解)
利用tac命令将文件内容逆序输出,替换第一个匹配到的bye,再逆序回原顺序,即可实现替换原文件最后一次出现的bye:
# 适配所有Unix-like系统的写法 tac file | sed '0,/bye/ s/bye/adieu/' | tac > tmp_file && mv tmp_file file
如果你的系统安装了moreutils工具包,还可以用sponge简化临时文件操作:
tac file | sed '0,/bye/ {s/bye/adieu/;q}' | tac | sponge file
小提示:上述命令中的q是匹配到第一个结果后就退出sed,减少大文件处理时的性能开销
方法2:纯sed实现(无额外依赖)
利用sed的保留空间特性和正则贪婪匹配,无需借助其他命令即可完成替换:
# GNU sed(大部分Linux发行版默认带的sed版本)写法 sed -i '1!G;h;$!d; s/\(.*\)bye/\1adieu/' file
实现逻辑说明:
- 逐行读取文件,将所有内容拼接后存入sed的保留空间
- 读取到最后一行时,用贪婪匹配
.*匹配到最后一个bye之前的所有内容,将bye替换为目标值
内容的提问来源于stack exchange,提问作者Jota
相关产品推荐
相关产品推荐

