在两个模式之间添加字符串 - sed

时间:2018-01-31 15:26:03

标签: linux bash sed

我正在寻找一个启动脚本,它将在两个模式之间添加一串文本。

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

3 个答案:

答案 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
相关问题