在正则表达式中传递变量(bash)

时间:2014-10-10 21:44:16

标签: regex bash perl

我尝试了所有表单将变量传递给Perl正则表达式,没有幸运。这里有什么问题?

FILENAME=test
perl -0pe 's|encoding="windows-1250".\?\>|encoding="utf-8" ?>\n <!-- ${FILENAME} -->\n|g' file_unprocessed.xml > file_processed_final.xml

我也尝试了$FILENAME\Q$FILENAME\E,但没有任何帮助。是否只有拼写错误?

1 个答案:

答案 0 :(得分:1)

我将通过一个更简单的例子向您介绍。假设您要打印单词test

我们可以用这个单行代码来做到这一点:

perl -e'print "test"'

现在假设我们将字符串test存储在变量$FILENAME中。我们可以用

打印出来
print "$FILENAME"

但我们必须先设置它:

perl -e'$FILENAME="test"; print "$FILENAME"'

但如果在bash中设置了该变量怎么办?你正确地做了这个部分。

FILENAME=test

让我们尝试在Perl中打印:

perl -e'print "$FILENAME"' # prints nothing

如果变量在单引号内,那么Perl正在解释它。如果我们把它放在单引号之外,那么它将在bash中解释,程序将被传递给perl解释器。

perl -e'print "'$FILENAME'"' # prints test
# open_^       ^   open__^ ^
# close________^   close___^

我喜欢将其视为关闭单引号以获取bash来解释变量,并再次打开它们以返回perl。

这让我绊倒了。您可以在此处阅读:Why is '$_' the same as $ARGV in a Perl one-liner?


您可以阅读\Q...\E here

您可能仍然需要它,例如,如果您的变量中有?。 Quotemeta将转义特殊字符以匹配其文字字符,而不是使用它们的特殊含义。