如果你只想與ACCEPT
s到全部更換DROP
S代表一個iptables鏈,用一個錨的行的開頭:
String=':INPUT'
sed -i -e 's/^\(*'"$String"' *\)DROP/\1ACCEPT/' "$File"
的命令在開始捕捉$String
模式(^
)附近有多個可選空格(*
),並且指的是與\1
捕獲的內容。
但是,如果你想整行匹配,使用錨線($
)結束還有:允許任何
sed -i -e 's/^\(*'"$String"' *\)DROP\(*\[0:0\] *\)$/\1ACCEPT\2/' "$File"
你可能想使表達更靈活一點的位數爲[<packet-counter>:<byte-counter>]
一對,由於計數器號碼是用於的iptables規則的邏輯並不重要:
sed -i -e 's/^\(*'"$String"' *\)DROP\(*\[[0-9]\+:[0-9]\+\]\)$/\1ACCEPT\2/' \
"$File"
上述命令替換已保存的iptables的條目文件如下:
< :INPUT DROP [0:0]
< :INPUT DROP [618709275:676424577017]
---
> :INPUT ACCEPT [0:0]
> :INPUT ACCEPT [618709275:676424577017]
另請注意使用雙引號。將變量括在雙引號中可防止重新解釋特殊字符,但$
,反向和\
除外。否則,您可能會將命令應用於多個文件(例如,如果$File
包含*
)。
究竟有多原始字符串中有多少認爲是固定的,適合匹配?在極端情況下,您可以簡單地匹配整個字符串並將其替換爲:'sed -i -e's/^:INPUT DROP [0:0] $ /:INPUT ACCEPT [0:0] /'' – chepner