我正在Perl脚本中调用一个Perl一行命令。
这个一行命令的目的是从文件中删除尾随空格。
在主Perl脚本内:
`perl -pi -e 's/\s+$//' tape.txt`;
现在它给我抛出一个错误 Substitution replacement not terminated at -e line 2.
问题出在哪里?
我正在Perl脚本中调用一个Perl一行命令。
这个一行命令的目的是从文件中删除尾随空格。
在主Perl脚本内:
`perl -pi -e 's/\s+$//' tape.txt`;
现在它给我抛出一个错误 Substitution replacement not terminated at -e line 2.
问题出在哪里?
这是因为你的主Perl脚本中有一个特殊变量$/
。需要注意的是,变量在``
字符串中和在""
字符串中一样被插值,而单引号并不改变这一点。你需要转义$
:
`perl -pi -e 's/\s+\$//' tape.txt;`
\s
匹配任何空白字符。如果您不想匹配换行符,则将 \\s*
替换为 [ ]*
,或者如果您想匹配空格和制表符,则使用 [ \t]*
。如果您想保留换行符,则使用 s/\\s*\\n\$/\\n/
。 - Dan$cmd_remove_tailing="perl -pi -e 's/\\s*\\n\$/\\n/' tape.txt"; system($cmd_remove_tailing);
- Govind Kailas反引号语法会调用一个shell,当被调用时,shell会假设它应该插入传递的字符串。
更简洁的语法可能是:
system('perl -pli -e "s/\s*$//" tape.txt');
由于您没有捕获命令的输出,因此使用反引号或qx
代替system
不是问题。
另外,添加-l
开关可以自动剪切每行读取并然后添加一个换行符 --- 这可能是您想要的。
\s 匹配 [ \t\n\r\f] ,但不想匹配 \n。
注意使用 {} 作为替换分隔符:
$ echo -e 'hi \nbye'| perl -pe 's{[\t\040]+$}{};' | cat -A
hi$
bye$
$cmd
";$cmd
- tinita