如果找不到任何内容,则sed查找替换或添加

时间:2014-04-01 20:24:16

标签: bash replace sed

我的config.txt文件中有以下内容。

some text
firmware_version 12.3
some more text ...

sed -i 's/^firmware_version .*/firmware_version 12.4/' /config.txt命令替换固件版本但是 我希望能够做到的是,即使sed找不到"firmware_version .*"的行出现,它仍会添加新的替换。

换句话说,如果我的config.txt文件包含以下内容:

some text
some more text ...

我仍然希望最终结果是

some text
firmware_version 12.4
some more text ...

我只是想为此提出一个通用的一行命令。

谢谢!

3 个答案:

答案 0 :(得分:1)

感谢您的回复

我真的在寻找一个更简单,更简单的解决方案,我希望sed在搜索到的文本不匹配时返回不同的退出状态,然后我可以决定下一步该做什么。

如果sed与特定代码不匹配,有一些discussions如何使grep -q '^firmware_version .*' /config.txt && sed -i 's/^firmware_version .*/firmware_version 12.4/' /config.txt || echo 'firmware_version 12.4' >> /config.txt 返回特定代码,但我无法使其正常工作且手册中未提及任何有关它(或者我可能错过了一些东西)

经过一番研究后,我found不是一个非常简洁但可接受的解决方案。

sed

因此,如果grep找到匹配,那么我们运行echo命令,否则我们{{1}}'firmware_version 12.4'文本到config.txt

答案 1 :(得分:0)

awk解决方案:

awk '/some text/,/some more text/{if (index($0, "firmware_version")) {$0="firmware_version 12.4"; p=1; next}} !p{sub(/$/, "\nfirmware_version 12.4"); p=1} 1' file

这给出了这个输出:

some text
firmware_version 12.4
some more text ...

对于两个输入文件:

some text
firmware_version 12.3
some more text ...

和这一个:

some text
some more text ...

答案 2 :(得分:0)

对于非空文件,这可行。不过,它是一个不同的模型。如果' firmware_version'出现在某些文字'之间还有一些文字'然后删除它。当您遇到更多文字时,请插入固件版本。我把编辑命令放到一个名为(非原创)sed.script的文件中是非常棘手的:

/some text/,/some more text/{
/firmware_version .*/d
/some more text/i\
firmware_version 12.4
}

然后,给定config-1.txt

some text
firmware_version 12.3
some more text

config-2.txt

some text
some more text

您可以像以下一样运行脚本:

sed -f sed.script config-1.txt

并为两个输入产生相同的输出:

some text
firmware_version 12.4
some more text

如果输入文件为空,我认为最好单独处理。此shell脚本片段将新文件写入标准输出:

if [ -s ${config_file} ]
then sed -f sed.script ${config_file}
else echo "firmware_version 12.4"
fi

如果您要覆盖原始文件并且sed支持-i.bak,则:

if [ -s ${config_file} ]
then sed -i.bak -f sed.script       ${config_file}
else echo "firmware_version 12.4" > ${config_file}
fi