【问题标题】:Passing variable in regex (bash) [duplicate]在正则表达式(bash)中传递变量[重复]
【发布时间】:2014-10-11 06:02:19
【问题描述】:

我尝试了所有形式将变量传递给 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,但没有任何帮助。只有错别字吗?

【问题讨论】:

  • 试试这个perl -0pe 's|encoding="windows-1250".\?\&gt;|encoding="utf-8" ?&gt;\n &lt;!-- '$FILENAME' --&gt;\n|g' file_unprocessed.xml &gt; file_processed_final.xml
  • 缺少撇号!谢谢!

标签: regex bash perl


【解决方案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...\Ehere

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

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2015-09-11
    • 1970-01-01
    • 2010-10-04
    • 2014-08-10
    • 2012-01-24
    • 2013-07-13
    • 2017-11-04
    相关资源
    最近更新 更多