如果我尝试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 模式。