如果我尝试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
按预期工作时),而第二个顺序是否正确处理?
答案 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模式。