如何使用sed命令仅替换文本文件每行最后一列的匹配值
操作场景
现有名为file.txt的空格分隔文本文件,每行最后一列是权限数值,需要将该列数值替换为对应的权限名称,不能修改行内其他位置的同值内容。
权限数值和名称的对应规则如下:
- 10:Minimal acces
- 20:Guest
- 30:View
- 40:Reporter
- 50:Owner
问题原因
原命令sed 's/\b30\b/View/g' file.txt为全局匹配逻辑,会替换文本中所有独立的30字段,未限定匹配位置,会误改行内时间、其他字段中出现的同值数字,无法满足仅替换最后一列的需求。
解决命令
使用行尾锚定正则,只匹配每行末尾的权限数值做替换,一次性完成所有映射转换,命令如下:
sed -E ' s/ 10$/ Minimal acces/ s/ 20$/ Guest/ s/ 30$/ View/ s/ 40$/ Reporter/ s/ 50$/ Owner/ ' file.txt
命令说明
- 正则中的
$是行尾锚定符,只会匹配每行最末尾、前面带空格的对应数字,完全不会触碰行内其他位置的同值内容 -E参数启用扩展正则语法,不需要额外转义字符,兼容GNU sed(Linux环境默认)、BSD sed(macOS环境默认)
如果需要直接把修改写入原文件,加上-i参数即可:
sed -i -E ' s/ 10$/ Minimal acces/ s/ 20$/ Guest/ s/ 30$/ View/ s/ 40$/ Reporter/ s/ 50$/ Owner/ ' file.txt
处理结果
执行命令后输出的内容完全符合预期格式,所有行最后一列的数值都被替换为对应权限名,其余字段内容保持不变。
内容的提问来源于stack exchange,提问作者ggg
相关产品推荐
相关产品推荐

