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