需要SED援助

时间:2016-11-22 16:17:35

标签: bash sed

我正在尝试编写一个脚本,它将根据字符串修改文件中的一行。如果字符串包含空格和括号,我无法确定正确的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

2 个答案:

答案 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)。