Perl:Bareword 在操作员预期的位置找到
Perl: Bareword found where operator expected at
我正在尝试使用 perl 来替换这样的字符串:
perl -pe "s/FlDigVal/$DIGN/" Header.xml > $DDIRP/$FNAME.xml
如果 DIGN=+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=
我得到以下语法错误:
Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "s/FlDigVal/+q4T/h"
Having no space between pattern and following word is deprecated at -e line 1.
syntax error at -e line 1, near "s/FlDigVal/+q4T/h"
Execution of -e aborted due to compilation errors.
我想这与 /h
处于变量 DIGN 中有关。有没有办法转义那些保留字?
问题不在于保留字,而在于 /
。
如果 DIGN
包含 +q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=
,您的命令将以下代码传递给 perl:
s/FlDigVal/+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=/
这里s/FlDigVal/+q4T/
解析为替换命令,其他都是垃圾
解决方案是不要让 shell 将变量插入代码中。相反,您可以通过环境传递字符串:
DIGN="$DIGN" perl -pe 's/FlDigVal/$ENV{DIGN}/' Header.xml
(如果 DIGN
已经导出,则不需要 DIGN="$DIGN"
部分。)
这里我们使用单引号(没有shell插值),让perl从环境中抓取一个值。
不要使用 shell 变量,它们只是不卫生的宏。将变量导出到 Perl 环境:
DIGN=$DIGN perl -pe 's/FlDigVal/$ENV{DIGN}/'
注意单引号:我们不希望 shell 更改 Perl 命令。
或将值作为参数传递:
perl -pe 'BEGIN { $replace = shift } s/FlDigVal/$replace/' "$DIGN" Header.xml
不过,您似乎正在使用正则表达式编辑 XML 文档。这是一种痛苦的方式,有像 XML::LibXML 这样的库可以正确处理 XML。例如。如果 DIGN 包含 &
或 <
会发生什么?
我正在尝试使用 perl 来替换这样的字符串:
perl -pe "s/FlDigVal/$DIGN/" Header.xml > $DDIRP/$FNAME.xml
如果 DIGN=+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=
我得到以下语法错误:
Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "s/FlDigVal/+q4T/h"
Having no space between pattern and following word is deprecated at -e line 1.
syntax error at -e line 1, near "s/FlDigVal/+q4T/h"
Execution of -e aborted due to compilation errors.
我想这与 /h
处于变量 DIGN 中有关。有没有办法转义那些保留字?
问题不在于保留字,而在于 /
。
如果 DIGN
包含 +q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=
,您的命令将以下代码传递给 perl:
s/FlDigVal/+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=/
这里s/FlDigVal/+q4T/
解析为替换命令,其他都是垃圾
解决方案是不要让 shell 将变量插入代码中。相反,您可以通过环境传递字符串:
DIGN="$DIGN" perl -pe 's/FlDigVal/$ENV{DIGN}/' Header.xml
(如果 DIGN
已经导出,则不需要 DIGN="$DIGN"
部分。)
这里我们使用单引号(没有shell插值),让perl从环境中抓取一个值。
不要使用 shell 变量,它们只是不卫生的宏。将变量导出到 Perl 环境:
DIGN=$DIGN perl -pe 's/FlDigVal/$ENV{DIGN}/'
注意单引号:我们不希望 shell 更改 Perl 命令。
或将值作为参数传递:
perl -pe 'BEGIN { $replace = shift } s/FlDigVal/$replace/' "$DIGN" Header.xml
不过,您似乎正在使用正则表达式编辑 XML 文档。这是一种痛苦的方式,有像 XML::LibXML 这样的库可以正确处理 XML。例如。如果 DIGN 包含 &
或 <
会发生什么?