我正在尝试编写一个脚本,它将根据字符串修改文件中的一行。如果字符串包含空格和括号,我无法确定正确的sed语法。
原始字符串:
:INPUT DROP [0:0]
需要改变:
:INPUT ACCEPT [0:0]
我写了以下内容并且有效;但是,因为它只计算一个部分字符串,我担心它会无意中修改文件中的其他行。我希望匹配整个字符串以避免这种情况。
#!/bin/bash
File=/etc/sysconfig/iptables
String=":INPUT"
sed -i -e "/$String/ s/DROP/ACCEPT/" $File
答案 0 :(得分:1)
使用GNU sed:
sed -i -r 's/(:INPUT )DROP( \[0:0\])/\1ACCEPT\2/' file
答案 1 :(得分:0)
如果您只想用DROP
替换iptables链的所有ACCEPT
,请在该行的开头使用锚点:
String=':INPUT'
sed -i -e 's/^\( *'"$String"' *\)DROP/\1ACCEPT/' "$File"
该命令捕获行的开头$String
模式(^
),周围有许多可选空格(*
),并使用{{引用捕获的内容1}}。
但是,如果要匹配整行,请使用锚点作为行尾(\1
):
$
您可能希望通过允许sed -i -e 's/^\( *'"$String"' *\)DROP\( *\[0:0\] *\)$/\1ACCEPT\2/' "$File"
对的任意位数来使表达式稍微灵活一些,因为计数器对于iptables规则的逻辑并不重要:
[<packet-counter>:<byte-counter>]
上面的命令替换了保存的iptables文件的条目,如下所示:
sed -i -e 's/^\( *'"$String"' *\)DROP\( *\[[0-9]\+:[0-9]\+\]\)$/\1ACCEPT\2/' \
"$File"
另请注意使用双引号。将变量括在双引号中可防止重新解释特殊字符,< :INPUT DROP [0:0]
< :INPUT DROP [618709275:676424577017]
---
> :INPUT ACCEPT [0:0]
> :INPUT ACCEPT [618709275:676424577017]
,反引号和$
除外。否则,您可能会将命令应用于多个文件(例如,如果\
包含$File
)。