我的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 ...
我只是想为此提出一个通用的一行命令。
谢谢!
答案 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