查找并替换一行,或添加到文件末尾

时间:2019-02-03 14:09:00

标签: bash sed

是否可以找到并替换文件中的一行,或者如果不存在则在其末尾附加一个字符串?

我知道我可以用它来查找并替换

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不在文件中,因此将其追加。

4 个答案:

答案 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