我有一个小文件如下:
$ cat text.txt
vacation
cat
This is a test
此命令可以正确地将所有出现的cat替换为CAT:
$ perl -p -i -e '
s/cat/CAT/g;
' text.txt
但为什么以下两个文件弄乱了? 以下内容删除文件的内容
$ perl -n -i -e '
$var = $_;
$var =~ s/cat/CAT/g;
' text.txt
这个只是没有正确替换
$ perl -p -i -e '
$var = $_;
$var =~ s/cat/CAT/g;
' text.txt
$ cat text.txt
cation
cat
This is a test
为什么呢?我在这里搞砸了什么?
答案 0 :(得分:4)
-p
自动打印出每一行($_
的内容,其中包含当前行的内容),重新填充文件(由于-i
使用中的标记),其中-n
循环遍历文件,如-p
,但它不会自动打印。你必须自己这样做,否则它只会覆盖文件。 -n
标记允许您跳过您不想重新插入原始文件的行(以及其他内容),因此-p
,您必须使用条件语句和next()
等来获得相同的结果。
perl -n -i -e '
$var = $_;
$var =~ s/cat/CAT/g;
print $var;
' text.txt
请参阅perlrun。
在上一个示例中,-p
只会自动打印$_
(原始未经修改的行)。它根本不会自动打印$var
,因此在这种情况下,您必须像上面的示例中那样打印$var
,但之后您将同时获得两者原始行,并将修改后的行打印到文件中。
如果您所做的一切都是覆盖文件,那么最好不要将$_
分配给任何内容。只是按原样使用它。例如。 (与你的第一个例子相同):
perl -p -i -e '
s/cat/CAT/g;
' text.txt