簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM