我正在使用FreeBSD,我有一个配置文件,我需要一个没有管道的内衬,找到一个特定的字符串,如果找到替换,如果没有附加到文件末尾。
我查看了不同的选项,比如,不能正常工作:
这是我必须工作的几乎所以:
gsed -r 's/search/replace/; t; $areplace' 'app.conf'
我遇到的问题是t
命令没有按预期工作。因为如果我在文件中有字符串“search”,它会进行替换,但它也会附加。如果“搜索”字符串是文件中的最后一个字符串,则它会进行替换,并且不会附加。
编辑 - 添加样本
示例输入:
ssh_enable="yes"
snmpd_enable="YES"
dumpdev="AUTO"
示例命令:
gsed -r 's/.*snmpd_enable=\".*\".*/snmpd_enable=\"NO\"/; t; $asnmpd_enable=\"NO\"/' 'app.conf'
预期产出:
ssh_enable="yes"
snmpd_enable="NO"
dumpdev="AUTO"
实际输出:
ssh_enable="yes"
snmpd_enable="NO"
dumpdev="AUTO"
snmpd_enable="NO"
编辑 - 解决方案
我最终使用@ 123解决方案,
gawk -i inplace '{x+=sub(/search/,"replace")}END{if(!x)print "replace"}1'
但问题是,如果文件不包含搜索字符串,则会打印替换。任何想法?
答案 0 :(得分:3)
使用gsed
sed 's/search/replace/;t1;/$^/{:1;H};${x;/./!{x;s/$/\nreplace/;b};x}' file
使用awk
awk '{x+=sub(/search/,"replace")}END{if(!x)print "replace"}1' file
使用您的实际数据
sed '/^snmpd_enable=/{s/="[^"]*"/="NO"/;H};${x;/./!{x;s/$/\nsnmpd_enable="NO"/;b};x}'
awk '/^snmpd_enable=/{x+=sub(/"[^"]*"/,"\"NO\"")}END{if(!x)print "snmpd_enable=\"NO\""}1'