如何绕过Perl的字符串转义s ///中的替换字符串?

时间:2011-02-02 22:54:14

标签: regex perl

我不确定究竟是什么称呼它,但我已经能够用两个单行重现我的问题。

从包含以下内容的文件'test.txt'开始:

foo

运行以下命令后(在bash中):

perl -n -e "s/(\w)oo/$1ar/; print;" test.txt

输出为“far

但是,当我引入一个包含替换字符串的变量时,

perl -n -e '$bar = q($1ar); s/(\w)oo/$bar/; print;' test.txt

输出为“$1ar”。

我需要更改哪些内容,以便第二个程序也会输出“far”以及我需要学习哪些关键字才能使这个答案成为可用的?

另外,我尝试将第二个更改为s /// e,无效。

编辑:这不是我想问的问题,即here

3 个答案:

答案 0 :(得分:6)

这适用于我(在bash中;您可能需要更改引号):

perl -n -e '$bar = "\${1} . ar"; s/(\w)oo/$bar/ee; print;' test.txt

ee将替换部分视为文本字符串。请参阅perlop(1)

答案 1 :(得分:1)

我希望有人会有更好的东西,但这对我有用:

perl -n -e '$bar=q($1."ar"); s/(\w)oo/eval($bar)/e; print;' test.txt

我将$ bar设置为将$1连接到'ar'的表达式,以便我可以在替换部分中使用e标记来评估它。

答案 2 :(得分:1)

@maxelost的

/ ee是正确的。

这适用于perl程序
$bar = q("${1}ar");
$str = "foo";
$str =~ s/(\w)oo/$bar/ee;
print $str;

所以我猜这个在bash中起作用:

perl -e '$bar = q("${1}ar"); s/(\w)oo/$bar/ee; print;' test.txt

在Windows中

perl -e "$bar = q(\"${1}ar\"); s/(\w)oo/$bar/ee; print;" test.txt