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

编写启动脚本:如何用sed在指定模式间正确添加字符串?

解决sed替换/etc/hosts时误匹配第一个目标字符串的问题

我明白你的问题了——你想在/etc/hosts里某一行的最后一个instance-1后面添加指定文本,但现有的sed命令因为匹配到了第一个出现的instance-1,导致格式完全乱了。

问题根源

你的原命令sed -i 's/\<instance-1\>/& 104.197.247.254 instance1.com/' /etc/hosts里,\<instance-1\>会匹配行内第一个符合单词边界的instance-1,这就导致插入位置出错。我们需要让sed定位到行内最后一个instance-1。

正确的sed命令

可以利用正则的贪婪匹配特性来实现,写法如下:

sed -i 's/\(.*\)\<instance-1\>/\1instance-1 104.197.247.254 instance1.com/' /etc/hosts

命令解释

  • \(.*\):贪婪匹配从行首到最后一个instance-1之前的所有内容(正则默认贪婪,会尽可能多匹配,所以只会停在最后一个目标字符串前)
  • \<instance-1\>:匹配最后一个符合单词边界的instance-1
  • \1:引用前面捕获的内容,再拼接上原字符串和要添加的文本,精准把内容插在了最后一个instance-1后面

更精准的匹配(可选)

如果你的目标行都带有# Added by Google注释,可以加上行过滤,避免误改其他行:

sed -i '/# Added by Google/s/\(.*\)\<instance-1\>/\1instance-1 104.197.247.254 instance1.com/' /etc/hosts

验证效果

执行后,你的/etc/hosts目标行会变成:

8.34.217.13 cds.rhel.updates.googlecloud.com 10.128.0.2 instance-1.c.testenvio1.internal instance-1 104.197.247.254 instance1.com # Added by Google

完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:34:18