如果找不到,Linux搜索并替换文件中的字符串

时间:2016-02-22 10:31:15

标签: regex bash sed

我正在使用FreeBSD,我有一个配置文件,我需要一个没有管道的内衬,找到一个特定的字符串,如果找到替换,如果没有附加到文件末尾。

我查看了不同的选项,比如,不能正常工作:

  1. how-to-add-a-line-in-sed-if-not-match-is-found

  2. sed-command-how-to-replace-if-exists-else-just-insert

  3. 这是我必须工作的几乎所以:

    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'
    

    但问题是,如果文件不包含搜索字符串,则会打印替换。任何想法?

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'