2016-11-22 145 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