我希望构建一个启动脚本,该脚本将在两种模式之间添加文本字符串。
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