![仅在与模式匹配的每行下方添加一行(如果尚不存在)](https://linux22.com/image/89262/%E4%BB%85%E5%9C%A8%E4%B8%8E%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E6%AF%8F%E8%A1%8C%E4%B8%8B%E6%96%B9%E6%B7%BB%E5%8A%A0%E4%B8%80%E8%A1%8C%EF%BC%88%E5%A6%82%E6%9E%9C%E5%B0%9A%E4%B8%8D%E5%AD%98%E5%9C%A8%EF%BC%89.png)
可以sed
在特定内容下面添加新行,如果输入内容存在则保留它?
文件的当前内容ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
所需的文件内容ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
我可以使用以下命令添加内容
sed -i '/Os version rhel5.6/a apache 4.2' ssss
我的问题
我想在指定内容下面添加一行(如果文件中存在该内容),然后保留它。如果该内容不存在,则添加它。
答案1
这个perl
表达式就能达到目的,
perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
解释
next if /apache 4.2/
跳过任何匹配的行apache 4.2
。s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print
搜索Os version rhel5.6
并用相同的行替换行并apache 4.2
在换行符处附加。
使用您的输入文件进行测试
$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
答案2
这是一种方法sed
:
sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile
这apache 4.2
无条件地附加到所有匹配的行,Os version rhel5.6
然后(如果不在最后一行)它通过n
(打印模式空间)拉入下一行,如果新的模式空间内容匹配,apache 4.2
它将删除它。如果需要包含前导/尾随空格,请调整正则表达式,例如/^[[:blank:]]*apache 4\.2[[:blank:]]*$/d