我的脚本将一个文本块附加到文件的末尾。
ActiveCell.Offset(1, 0).Activate
如果我的文本块不存在,它会使用以下内容成功附加如上所示的文件:
### 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
问题是我失去了“$ IPT”并最终使用以下内容:
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。当我重新访问文件以替换$ HEAD和$ TAIL之间的现有内容并将perl函数与更新的块一起使用时,转义的美元符号似乎不成立。我的猜测是它被解释了,如果逃避不够,我不知道如何防止这种情况。
有谁知道如何修改上面的命令以维持“$ IPT”?
答案 0 :(得分:0)
是的,你是正确的$IPT
在perl中的正则表达式中被解释。
所以,使用\$IPT
这样你就可以逃避$
的shell。但是你还需要为perl转义$
,所以它不应该解释。为此你应该这样做:
REPLACEMENT_CONTENT="
\\\$IPT -A INPUT -s 8.8.8.8 -j ACCEPT
\\\$IPT -A INPUT -s 8.8.8.4 -j ACCEPT"
这一次转义\
,然后$
本身发送perl \$
,因此无法解释。
或强>
将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