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

Linux 在bash中使用sed修改配置文件,linux,bash,unix,sed,Linux,Bash,Unix,Sed,我正在尝试在/etc/sysctl.conf中将net.ipv4.ip\u forward设置为1。下面的操作很好,但确实缺少一些边缘情况 #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

我正在尝试在
/etc/sysctl.conf
中将
net.ipv4.ip\u forward
设置为1。下面的操作很好,但确实缺少一些边缘情况

#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 
例如,如果sysctl.conf包含以下任何一项,则它将不匹配

#net.ipv4.ip_forward=1

##net.ipv4.ip#u forward=1


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

您可以使用
-r
开关在
GNU sed
中启用扩展正则表达式(
ERE
),并可以选择将空格和出现的

这将匹配以下任何输入行,并使用替换部件对其进行修改
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

有关详细信息,请参见。

您可以使用此设置为零个或多个空格以及零个或多个#(注释)


删除所有与
net.ipv4.ip\u forward
匹配的行,不管是否注释掉,然后添加所需内容,怎么样

fgrep -v net.ipv4.ip_forward /etc/sysctl.conf > /etc/sysctl.conf.tmp
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf.tmp
mv /etc/sysctl.conf.tmp /etc/sysctl.conf

这是简单易读的。

是的,通过指定
net.ipv4.ip_forward
应位于行的最开头。就这么简单。可以在任何sed教程中找到。虽然这是一个很好的尝试,但对于输入
#net.ipv4.ip_forward=1
##net.ipv4.ip_forward=1
仍然不起作用,请尝试此sed-i/[#124; net.ipv4.ip_forward[]*=0 | 1]*/net.ipv4.ip_forward=1/g'/etc sysctl.conf
sed -i 's/[#| ]*net.ipv4.ip_forward[ ]*=[ ]*0/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 
fgrep -v net.ipv4.ip_forward /etc/sysctl.conf > /etc/sysctl.conf.tmp
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf.tmp
mv /etc/sysctl.conf.tmp /etc/sysctl.conf