2016-11-22 94 views
0

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

究竟有多原始字符串中有多少认为是固定的,适合匹配?在极端情况下,您可以简单地匹配整个字符串并将其替换为:'sed -i -e's/^:INPUT DROP [0:0] $ /:INPUT ACCEPT [0:0] /'' – chepner

回答

0

如果你只想与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包含*)。

1

随着GNU sed的:

sed -i -r 's/(:INPUT)DROP(\[0:0\])/\1ACCEPT\2/' file