Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么命令行中的以下s/g变体是错误的?_Regex_Perl_Command Line - Fatal编程技术网

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

Regex 为什么命令行中的以下s/g变体是错误的?,regex,perl,command-line,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 这一个不能正确地进行替换 $ p

我有一个小文件,如下所示:

$ 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
为什么??我在这里搞砸了什么?

-p会自动打印出$的每一行内容,其中包含当前行的内容,由于使用了-I标志,它会重新填充文件,其中-n会像-p一样在文件上循环,但不会自动打印。你必须自己去做,否则它只会覆盖文件而没有任何内容。-n标志允许您跳过不想重新插入原始文件的行以及其他内容,因此使用-p时,您必须使用条件语句以及next等来实现相同的结果

perl -n -i -e '  
$var = $_;  
$var =~ s/cat/CAT/g;
print $var;  
' text.txt  

在上一个示例中,-p将只自动打印未修改的原始行$。它根本不会自动打印$var,因此在这种情况下,您必须像上面的示例中那样打印$var,但随后您会将原始行和修改后的行打印到文件中

如果您所做的只是覆盖一个文件,那么最好不要将$分配给任何对象。照原样用就行了。与你的第一个例子相同:

perl -p -i -e '   
s/cat/CAT/g;  
' text.txt  

重新填充文件是什么意思?它是用标准打印的,对吗?不,不是用-i。该标志表示重写文件test.txt。因此,您正在使用-i标志写回该文件。要打印到STDOUT,请不要使用-i或检查perl-h