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



我尝试了所有形式将变量传递给Perl正则表达式,但没有成功。这里怎么了?

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

我也试过$FILENAMEQ$FILENAMEE,但都无济于事。只有一个打字错误吗?

我将用一个更简单的例子来引导您完成这一过程。假设您要打印单词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。

这件事以前让我绊倒过。你可以在这里阅读:为什么是'$_';与Perl单行中的$ARGV相同?


你可以在这里阅读Q...E

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

最新更新