使用 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
^
和 $
分别将字符串锚定到行首和行尾。点需要反斜杠转义,否则它们代表任何字符。
在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
^
和 $
分别将字符串锚定到行首和行尾。点需要反斜杠转义,否则它们代表任何字符。