在 bash 中使用 sed 修改配置文件

use*_*277 2 unix linux bash sed

我试图设置net.ipv4.ip_forward到1 /etc/sysctl.conf。以下工作正常,但它肯定遗漏了一些边缘情况

#Enable IP packet forwarding so that our VPN traffic can pass through.
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf 
sed -i 's/#net.ipv4.ip_forward = 1/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf 
grep -qF "net.ipv4.ip_forward" /etc/sysctl.conf  || echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
Run Code Online (Sandbox Code Playgroud)

例如,如果 sysctl.conf 包含以下任何一项,它将不匹配

#net.ipv4.ip_forward=1

##net.ipv4.ip_forward=1.

有没有更可靠的方法来修改配置文件中的设置?

Ini*_*ian 5

您可以使用该-r开关启用扩展正则表达式(ERE),GNU sed并可选择匹配空白和#正则表达式?可选项目锚点的出现

sed -ir 's/#{1,}?net.ipv4.ip_forward ?= ?(0|1)/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

这将匹配以下任何输入行并使用替换部件对其进行修改 net.ipv4.ip_forward = 1

net.ipv4.ip_forward=0
net.ipv4.ip_forward = 0
#net.ipv4.ip_forward=0
##net.ipv4.ip_forward = 0
#net.ipv4.ip_forward=1
##net.ipv4.ip_forward=1
#net.ipv4.ip_forward = 1
##net.ipv4.ip_forward = 1
Run Code Online (Sandbox Code Playgroud)

请参阅RegEx 演示以获得更清晰的信息。