在两个模式之间添加字符串 - 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 命令,但它在遇到第一个"实例-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

也许一些关于数据来自哪里的见解在这里肯定会有所帮助。

# Added by Google表明这些行包含有关Google Compute Engine实例的信息。更重要的是,它们是谷歌添加的行,幸运的是遵循预定义的模式。

在这种情况下,如下所示的内容会有所帮助

$ 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

旁注:实际的空间数也会保留。

试试这个:

sed -i 's/^([0-9.]* [^ ]* <instance-1>)/1 104.197.247.254 instance1.com/' /etc/hosts

此表达式将读取前两个字段,然后尝试仅匹配第三个字段中的instance-1(这假设字段由单个空格分隔符分隔 - 如果不是这种情况,您可以调整正则表达式......

()表示 sed 应将匹配的文本存储在变量1中。 ^强制它仅从行的开头匹配。 其余的非常简单

instance-1后面包含空格,以将其与第一次出现区分开来:

$ 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

对于此示例,它看起来像:

# You still need that whitespace to distinguish the second occurrence from first:
$ sed '/instance-1 /,/# Added/s//&104.197.247.254 instance1.com /g' inputFile

最新更新