我正在寻找一个启动脚本,它将在两个模式之间添加一串文本。
8.34.217.13 cds.rhel.updates.googlecloud.com
10.128.0.2 instance-1.c.testenvio1.internal instance-1 **want to add string here** # Added by Google
169.254.169.254 metadata.google.internal # Added by Google
我希望它看起来像这样:
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
169.254.169.254 metadata.google.internal # Added by Google
我正在使用以下sed命令,但是当它遇到第一个“instance-1”时会插入我的字符串
sed -i 's/\<instance-1\>/& 104.197.247.254 instance1.com/' /etc/hosts
8.34.217.13 cds.rhel.updates.googlecloud.com
10.128.0.2 instance-1 104.197.247.254 instance1.com.c.testenvio1.internal instance-1 # Added by Google
169.254.169.254 metadata.google.internal # Added by Google
答案 0 :(得分:1)
或许对数据来源的一些见解在这里肯定是有帮助的。
# Added by Google
表示这些行包含有关Google Compute Engine实例的信息。更重要的是,它们是Google添加的行,幸运的是遵循预定义的模式。
在这种情况下,下面的内容会有所帮助
$ sed -Ei -- 's/([[:blank:]]+instance-1[[:blank:]]+)(#.*)$/\1 104.197.247.254 instance1.com \2/' /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
169.254.169.254 metadata.google.internal # Added by Google
旁注:也会保留实际的空格数。
答案 1 :(得分:0)
试试这个:
sed -i 's/^\([0-9.]* [^ ]* \<instance-1\>\)/\1 104.197.247.254 instance1.com/' /etc/hosts
此表达式将读取前两个字段,然后尝试仅匹配第三个字段中的instance-1
(这假设字段由单个空格分隔符分隔 - 如果不是,则可以调整正则表达式案件......)
\(
和\)
表示sed应将匹配的文本存储在变量\1
中。 ^
强制它仅从行的开头匹配。其余的很直接
答案 2 :(得分:0)
在Mappable
之后加入空格,以区别于第一次出现:
instance-1
OR
如果您知道它总是第二次出现,请使用$ sed -i 's/instance-1 /&104.197.247.254 instance1.com /g' inputFile
替换它,
/2
供将来参考,如果您想在两种模式之间添加字符串
$ sed -i 's/instance-1/& 104.197.247.254 instance1.com /2' inputFile
对于这个例子,它看起来像,
$ sed '/pattern1/,/pattern2/s//& INSERT THIS TEXT/g' inputFile