使用 Sed 仅替换包含字符串的整行

Replace only whole line containing a string using Sed

在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

如何只替换一行?

你需要

  • 匹配字符串开头的文本
  • 逃避圆点
  • 删除 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

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

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

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

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

Server=127.0.0.10

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

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

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