为什么以下命令行的s / g变化是错误的?

时间:2016-05-28 14:59:20

标签: regex perl command-line

我有一个小文件如下:

$ 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

为什么呢?我在这里搞砸了什么?

1 个答案:

答案 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