仅在与模式匹配的每行下方添加一行(如果尚不存在)

仅在与模式匹配的每行下方添加一行(如果尚不存在)

可以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

相关内容