【问题标题】:Replace only whole line containing a string using Sed使用 Sed 仅替换包含字符串的整行
【发布时间】:2021-12-30 05:20:33
【问题描述】:

在 zabbix-agent.conf 我有几行:

#   Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
Server=127.0.0.1

我要换行

Server=127.0.0.1

和我的

Server=zabbix.mydomain.com

如果我这样做了

sed -i -e 's/Server=127.0.0.1/Server=zabbix.mydomain.com/g' /etc/zabbix/zabbix_agentd.conf

它还发现与注释示例一致并替换其中的字符串。我明白了:

#<----->Example: Server=zabbix.mydomain.com,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
Server=zabbix.mydomain.com

如何只替换一行?

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    你需要

    • 匹配字符串开头的文本
    • 避开点
    • 删除 g 标志,因为匹配只会在字符串开头找到。

    另外,你不需要-e 选项,你可以使用

    sed -i 's/^Server=127\.0\.0\.1/Server=zabbix.mydomain.com/' /etc/zabbix/zabbix_agentd.conf
    

    online demo

    #!/bin/bash
    s='#   Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
    Server=127.0.0.1'
    sed 's/^Server=127\.0\.0\.1/Server=zabbix.mydomain.com/g' <<< "$s"
    

    输出:

       Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
    Server=zabbix.mydomain.com
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed -i '/^Server=127\.0\.0\.1/cServer=zabbix.mydomain.com' file
      

      将以Server=127.0.0.1 开头的行更改为Server=zabbix.mydomain.com

      【讨论】:

        【解决方案3】:

        其他答案几乎没问题,但它们也会替换如下一行:

        Server=127.0.0.10
        

        任何 sed 的完整解决方案可能是:

        sed -i 's/^Server=127\.0\.0\.1$/Server=zabbix.mydomain.com/' /etc/zabbix/zabbix_agentd.conf
        

        ^$ 分别将字符串锚定到行首和行尾。点需要反斜杠转义,否则它们代表任何字符。

        【讨论】:

          猜你喜欢
          • 2012-06-30
          • 1970-01-01
          • 2020-09-07
          • 2014-03-30
          • 2018-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多