[英]Modify config files with sed in bash
我試圖在/etc/sysctl.conf
中將net.ipv4.ip_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_forward=1
。
是否有更可靠的方法來修改配置文件中的設置?
您可以使用-r
開關來啟用擴展正則表達式( ERE
)在GNU sed
和可選匹配空白和#
occurence用正則表達式?
可選項錨 ,
sed -ir 's/#{1,}?net.ipv4.ip_forward ?= ?(0|1)/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
這將匹配以下任何輸入行,並使用替換部件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
有關更清晰的信息,請參閱RegEx演示 。
刪除匹配net.ipv4.ip_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
這很簡單易讀。
您可以使用此設置為零個或多個空格以及零個或多個#(注釋)執行此操作
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.