如果你只想与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