为什么`perl -i -p0e <expression>`工作,而不是`perl -0 -pie <expression>`?

时间:2017-05-12 17:22:56

标签: regex perl

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

但是,如果我想使用-0运行包含换行符的表达式,则只需在该选项前添加不起作用:

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

经过多次尝试,以下组合起作用:

$ perl -i -p0e 's/foo\nbar/qux/' file.txt

我的问题是:为什么第一个选项顺序会产生错误(特别是当普通-pie按预期工作时),而第二个顺序是否正确处理?

1 个答案:

答案 0 :(得分:6)

  • -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模式。