我尝试了所有表单将变量传递给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
,但没有任何帮助。是否只有拼写错误?
答案 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将转义特殊字符以匹配其文字字符,而不是使用它们的特殊含义。