为什么 'perl -i -p0e ' <expression>有效,但 'perl -0 -pie <expression>'不起作用?



如果我尝试perl -pie 's/foo/bar/' file.txt它按预期工作:执行查找-替换表达式,并将结果保存到原始文件中。

但是,如果我想使用 -0 运行包含换行符的表达式,只需在选项前面加上前缀就行不通了:

$ perl -0 -pie 's/foonbar/qux/' file.txt
Can't open perl script "s/foonbar/qux/": No such file or directory

经过几次尝试,以下组合奏效了:

$ perl -i -p0e 's/foonbar/qux/' file.txt

我的问题是:为什么选项的第一顺序会产生错误(尤其是当纯-pie按预期工作时(,而第二顺序得到正确处理?

  • -i意味着无需备份即可就地工作。
  • -ie意味着就地工作,有备份。备份与原始文件具有相同的名称,但附加了e

这意味着perl -pie 's/foo/bar/' file.txt也不起作用(除非您有一个名为 s/foo/bar/ 的 Perl 文件(。

如果您只是合乎逻辑地排列选项,则可以避免问题。 -i与程序无关——如果添加/删除它仍然可以工作——所以无论如何把它放在第一位更有意义。 -p-0777 ,otoh,是该计划的一部分,因此将它们放在-e旁边是有意义的。因此,明智地编写命令会导致以下情况之一:

perl -i  -0777pe'...' ...
perl -i~ -0777pe'...' ...
perl     -0777pe'...' ...

请注意,我使用了-0777,因为-0将输入视为以 NUL 终止的行,而不是激活 slurp 模式。

最新更新