僅在與模式相符的每行下方新增一行(如果尚不存在)

僅在與模式相符的每行下方新增一行(如果尚不存在)

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

相關內容