2015-11-28 37 views
-4

我的腳本將一段文本附加到文件末尾。

### Start My Block 
$IPT -A INPUT -s 8.8.8.8 -j ACCEPT 
$IPT -A INPUT -s 8.8.8.4 -j ACCEPT 
### End My Block 

如果我的文字塊不存在,它成功地追加文件如上圖所示,使用下列內容:

HEAD="### Start My Block" 
TAIL="### End My Block" 
REPLACEMENT_CONTENT=" 
\$IPT -A INPUT -s 8.8.8.8 -j ACCEPT 
\$IPT -A INPUT -s 8.8.8.4 -j ACCEPT" 

echo -e "$HEAD" >> $FILE 
echo -e "$REPLACEMENT_CONTENT" >> $FILE 
echo -e "$TAIL" >> $FILE 

如果我的文字塊存在,它試圖替換使用塊的內容以下:

HEAD="### Start My Block" 
TAIL="### End My Block" 
REPLACEMENT_CONTENT=" 
\$IPT -A INPUT -s 4.4.4.4 -j ACCEPT 
\$IPT -A INPUT -s 4.4.2.2 -j ACCEPT" 

perl -0777 -i -pe "s/($HEAD).*(\\n$TAIL)/\$1$REPLACEMENT_CONTENT\\$2/s" $FILE 

問題是,我失去了 「$ IPT」 和最終使用下列內容:

### Start My Block 
-A INPUT -s 4.4.4.4 -j ACCEPT 
-A INPUT -s 4.4.2.2 -j ACCEPT 
### End My Block 

當我輸出上述通過「>>」,美元符號轉義\ $,包括$ IPT。當我重新訪問該文件以替換$ HEAD和$ TAIL之間的現有內容並在更新的塊中使用perl函數時,逃逸的美元符號似乎不成立。我的猜測是它被解釋,我不知道如果逃避是不夠的,如何防止這種情況。

有誰知道我如何修改上面的命令來維護「$ IPT」?

+9

什麼是在變量'HEAD','TAIL'和'REPLACEMENT_CONTENT'?或者你是否真的期望我們成爲mindreaders? – tripleee

+0

謝謝!三重逃脫做到了! –

回答

0

是的,你是對的你的$IPT得到解釋在您的Perl正則表達式裏面。

因此,使用\$IPT這是你逃脫$殼。但是您還需要爲perl轉義$,以便它不應該解釋。對於你應該這樣做:

REPLACEMENT_CONTENT=" 
\\\$IPT -A INPUT -s 8.8.8.8 -j ACCEPT 
\\\$IPT -A INPUT -s 8.8.8.4 -j ACCEPT" 

此逃脫\一次,然後$本身發送的perl \$因此它沒有得到解釋。

OR

在單引號只是包裝REPLACEMENT_CONTENT

REPLACEMENT_CONTENT=' 
\$IPT -A INPUT -s 8.8.8.8 -j ACCEPT 
\$IPT -A INPUT -s 8.8.8.4 -j ACCEPT' 

perl部分後:

perl -0777 -i -pe "s/($HEAD).*($TAIL)/\$1$REPLACEMENT_CONTENT\n\$2/s" $FILE