Regex Linux搜索并替换文件中未找到的字符串
我使用的是FreeBSD,我有一个配置文件,我需要一个不带管道的单行程序来查找特定字符串,如果找到,则替换,如果没有,则追加到文件的末尾 我查看了不同的选项,例如,not works ok: 这是我必须要做的,几乎可以:Regex Linux搜索并替换文件中未找到的字符串,regex,bash,sed,Regex,Bash,Sed,我使用的是FreeBSD,我有一个配置文件,我需要一个不带管道的单行程序来查找特定字符串,如果找到,则替换,如果没有,则追加到文件的末尾 我查看了不同的选项,例如,not works ok: 这是我必须要做的,几乎可以: gsed -r 's/search/replace/; t; $areplace' 'app.conf' 我遇到的问题是t命令没有按预期工作。因为如果我在文件中有字符串“search”,它会进行替换,但也会追加。如果“search”字符串是文件中的最后一个字符串,它将进
gsed -r 's/search/replace/; t; $areplace' 'app.conf'
我遇到的问题是t
命令没有按预期工作。因为如果我在文件中有字符串“search”,它会进行替换,但也会追加。如果“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'
但这里的问题是,如果文件不包含搜索字符串,它将打印替换。对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'
与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'
添加示例输入和预期输出数据,现在只需等待@anubhava的awk解决方案:-),但不能用sed完成吗?为什么t-命令不能按预期工作?如果您的问题也存在,您可以在标题中提到Windows…添加示例输入和预期输出数据,现在只需等待@anubhava的awk解决方案:-),但不能用sed完成吗?为什么t-命令不能按预期工作?如果您的问题也存在,您可以在标题中提及Windows…您的解决方案工作正常,但如果未找到搜索模式,它将删除最后一行并附加替换模式。@mUncescu已修复,它没有删除它,我忘记将其替换回。My+1 for awk solution,
sed
不是最好的工具,我相信:)我有一个问题。您的awk解决方案会打印动作,您可以更新它以同时修改文件吗?@mUncescu解决它,这不是很难。一个简单的谷歌搜索会告诉你怎么做。你的解决方案工作得很好,但是如果没有找到搜索模式,它会删除最后一行并附加替换模式。@mUncescu修复了,它没有删除它,我忘了把它换回来。我的+1 for awk解决方案,sed
不是最好的工具,我相信:)我有一个问题。您的awk解决方案会打印动作,您可以更新它以同时修改文件吗?@mUncescu解决它,这不是很难。一个简单的谷歌搜索会告诉你怎么做。