是否可以找到并替换文件中的一行,或者如果不存在则在其末尾附加一个字符串?
我知道我可以用它来查找并替换:
sed -i -e "s/^SEARCH/LINE 1\nLINE 2/" file
我知道我可以附加到这样的文件:
cat << EOF | tee -i file1 file2
LINE 1
LINE 2
EOF
是否可以通过某种方式将其组合。因此,如果/^SEARCH.*$/
匹配,则替换它,如果不匹配,则将替换内容附加到文件末尾。
使用更好的输入/输出示例进行更新:
例如,如果我有此输入文件testfile
:
Alpha
Bravo
Charlie
假设我想查找Bravo
并将其替换为Bravo=bingo
, OR 如果Bravo=bingo
不存在,请添加Bravo
,预期输出是:
Alpha
Bravo=bingo
Charlie
这是因为文件中存在Bravo
,因此将其替换。
假设我想查找Delta
并将其替换为Delta=bingo
, OR 如果Delta=bingo
不存在,请添加Delta
,预期输出是:
Alpha
Bravo
Charlie
Delta=bingo
这是因为Delta
不在文件中,因此将其追加。
答案 0 :(得分:2)
替换部分与https://stackoverflow.com/a/54504046/1745001完全相同,但是在这里针对此特定用例进行了简化,并且仅通过设置找到的标志并在END打印来完成添加未找到的附加操作。如果未设置该标志:
awk 'BEGIN{new="LINE 1\nLINE 2"} /^SEARCH/{$0=new; f=1} {print} END{if (!f) print new}' file
同样,上述操作使用字符串进行替换,因此适用于任何字符,/^SEARCH/
是一个正则表达式,因为您似乎没有正则元字符,但是如果您这样做,则可以将其更改为{ {1}}或类似名称来进行字符串而不是进行正则表达式匹配。
答案 1 :(得分:1)
单线:
title
如果要就地更改,则不能代替就地:
[root@rgenupula1c puppet-enterprise-2019.0.2-el-7-x86_64]# /opt/puppetlabs/puppet/bin/puppet agent --enable
Ignoring executable-hooks-1.3.2 because its extensions are not built. Try: gem pristine executable-hooks --version 1.3.2
Ignoring gem-wrappers-1.3.2 because its extensions are not built. Try: gem pristine gem-wrappers --version 1.3.2
Ignoring executable-hooks-1.3.2 because its extensions are not built. Try: gem pristine executable-hooks --version 1.3.2
Ignoring gem-wrappers-1.3.2 because its extensions are not built. Try: gem pristine gem-wrappers --version 1.3.2
cannot load such file -- semantic_puppet
[root@rgenupula1c puppet-enterprise-2019.0.2-el-7-x86_64]#
请记住,如果它们包含awk 'gsub(/^SEARCH/,"LINE 1\nLINE 2"){s=1}END{if(!s)print "LINE 1\nLINE 2"}1' file
个字符,则要避免使用原始字符和替换字符,这比文本不长时更改为match / substr方法要容易。
答案 2 :(得分:0)
不知道单个sed
命令,但是您可以只用sed
备份文件,然后测试差异。如果没有区别,请附加到文件末尾:
sed -i.bak -e 's/^SEARCH/LINE 1\nLINE 2/' file
diff file file.bak > /dev/null
if [ $? -eq 0 ]; then
sed -i -e '$aLINE 1\nLINE 2' file
fi
答案 3 :(得分:0)
GNU单线:
sed -i 's/^SEARCH/LINE 1\nLINE 2/;ts;bt;:s;h;:t;${x;/./!{x;s/$/\nLINE 1\nLINE 2/;be};x};:e' file