如何使用sed将匹配关键词的首次行替换为Value1、第二次替换为Value2
正确实现方式
你之前尝试的写法不生效,原因是sed替换语法里的数字标记,默认只代表单行内的第N次匹配,不是全文件范围内匹配到的第N行。
你可以用以下两种方案实现需求:
方案1:sed 实现(直接修改原文件)
针对你的场景,匹配关键词"sudo docker push",第一次、第二次匹配到的整行分别替换为目标值,命令如下:
# Linux 环境执行 sed -i ' /sudo docker push/{ x /^$/{s//1/;x;s#.*#sudo docker push IP1:PORT/ABC:1#;b} /^1$/{s//2/;x;s#.*#sudo docker push IP2:PORT/ABC:1#;b} x }' your-file-name
命令说明:
- 每次匹配到含指定关键词的行时,用
x命令交换模式空间和保持空间的内容,借助保持空间存储匹配次数 - 保持空间为空时,说明是第一次匹配,更新次数标记为1,替换整行内容为第一个目标值后跳过后续处理
- 保持空间值为
1时,说明是第二次匹配,更新次数标记为2,替换整行内容为第二个目标值后跳过后续处理 - 匹配次数超过2次时,不做修改直接输出
注:如果是MacOS环境,需要把
sed -i改为sed -i ''
方案2:awk 实现(逻辑更直观)
如果允许用awk,语法会更易懂,不用处理sed的空间交换逻辑:
awk '/sudo docker push/{ c++ if(c==1) $0="sudo docker push IP1:PORT/ABC:1" else if(c==2) $0="sudo docker push IP2:PORT/ABC:1" }1' your-file-name > tmp && mv tmp your-file-name
命令说明:
- 匹配到关键词行时计数器
c自增 - 根据计数器值对应替换整行内容
- 末尾的
1表示输出所有处理后的行,最后通过临时文件覆盖原文件即可
内容的提问来源于stack exchange,提问作者Chaitan Yadav
相关产品推荐
相关产品推荐

