Regex Linux搜索并替换文件中未找到的字符串

Regex Linux搜索并替换文件中未找到的字符串,regex,bash,sed,Regex,Bash,Sed,我使用的是FreeBSD,我有一个配置文件,我需要一个不带管道的单行程序来查找特定字符串,如果找到,则替换,如果没有,则追加到文件的末尾 我查看了不同的选项,例如,not works ok: 这是我必须要做的,几乎可以: gsed -r 's/search/replace/; t; $areplace' 'app.conf' 我遇到的问题是t命令没有按预期工作。因为如果我在文件中有字符串“search”,它会进行替换,但也会追加。如果“search”字符串是文件中的最后一个字符串,它将进

我使用的是FreeBSD,我有一个配置文件,我需要一个不带管道的单行程序来查找特定字符串,如果找到,则替换,如果没有,则追加到文件的末尾

我查看了不同的选项,例如,not works ok:

  • 这是我必须要做的,几乎可以:

    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解决它,这不是很难。一个简单的谷歌搜索会告诉你怎么做。