You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bash替换文件每行末尾数字6为5的命令实现求助

问题原因

你使用的sed命令存在两个核心错误,导致没有生效:

  • 替换逻辑完全反向:s/\(.*\)5/\16/的语义是「匹配行内最后一个出现的数字5,将其替换为6」,和你要的「行尾数字6替换为5」需求完全相反
  • 没有锚定行尾:没有指定匹配行末尾的字符,只会匹配行内任意位置的对应数字,且你提供的source.txt所有行尾都没有数字5,所以命令没有匹配到任何内容,输出自然和原文件一致

正确实现方案

sed方案

核心是用$正则锚定符匹配行尾的数字:

# 结果输出到新文件
sed 's/6$/5/' source.txt > target.txt

# GNU sed 直接原地修改原文件
sed -i 's/6$/5/' source.txt

# MacOS 自带sed原地修改的写法
sed -i '' 's/6$/5/' source.txt

awk方案

简洁正则匹配版本

awk '{sub(/6$/,"5")}1' source.txt > target.txt

显式判断字符版本(可读性更高)

awk '{
  last_char = substr($0, length($0), 1)
  print last_char == "6" ? substr($0, 1, length($0)-1) "5" : $0
}' source.txt > target.txt

Bash原生循环方案

不需要额外依赖第三方工具:

while read -r line; do
  [[ $line == *6 ]] && echo "${line%?}5" || echo "$line"
done < source.txt > target.txt

内容的提问来源于stack exchange,提问作者7beggars_nnnnm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:27:03