我尝试了所有形式将变量传递给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$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将转义特殊字符以匹配其字面字符,而不是使用其特殊含义。