编写启动脚本:如何用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
相关产品推荐
相关产品推荐

