执行查找和替换时保持$(美元符号)

时间:2015-11-28 08:22:44

标签: regex bash perl

我的脚本将一个文本块附加到文件的末尾。

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”?

1 个答案:

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