为什么我的反斜杠会在我的Perl单行中消失?

Pra*_*. S 0 perl command-line escaping

我尝试搜索并替换目录中的所有文件,如下所示:

/usr/bin/perl -p -i -e "s/Else/Else  FILE_WRITE(\"C:\\TestDir\\mes.txt","Message received");/g"            *.scr
Run Code Online (Sandbox Code Playgroud)

这取代了所有出现Else"Else FILE_WRITE(\"C:\TestDir\mes_.txt","Message received");"

但是替换被认为如下:

Else  FILE_WRITE("C:TestDir^@mes.txt); 
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

jro*_*way 5

这实际上是一个shell问题,而不是Perl问题.

您需要转义文件名中的斜杠,否则shell会将它们解释为转义序列.

你现在拥有的:

$ echo "s/Else/Else FILE_WRITE(\"C:\TestDir\mes.txt","Message received");/g"
bash: syntax error near unexpected token `)'
Run Code Online (Sandbox Code Playgroud)

你想要什么:

$ echo "s/Else/Else FILE_WRITE(\"C:\\TestDir\\mes.txt\",\"Message received\");/g"
s/Else/Else FILE_WRITE("C:\TestDir\mes.txt","Message received");/g
Run Code Online (Sandbox Code Playgroud)

将来,请尝试使用单引号而不是双引号.然后你可以写而不逃避:

$ echo 's/Else/Else FILE_WRITE("C:\TestDir\mes.txt","Message received");/g'
s/Else/Else FILE_WRITE("C:\TestDir\mes.txt","Message received");/g
Run Code Online (Sandbox Code Playgroud)

Perl灵活的q和qq运算符也很有用:

$ perl -e 'print q{A double quote looks like this -> "}'
A double quote looks like this -> "
Run Code Online (Sandbox Code Playgroud)