为什么我的反斜杠在Perl一行程序中消失了?

为什么我的反斜杠在Perl一行程序中消失了?,perl,command-line,escaping,Perl,Command Line,Escaping,我尝试搜索并替换目录中的所有文件,如下所示: /usr/bin/perl -p -i -e "s/Else/Else FILE_WRITE(\"C:\\TestDir\\mes.txt","Message received");/g" *.scr 也就是说,将所有出现的Else替换为“Else FILE\u WRITE(\'C:\TestDir\mes\uuu.txt”,“Message received”);” 但替代方案如下所示: Else FILE_WRITE(

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

/usr/bin/perl -p -i -e "s/Else/Else  FILE_WRITE(\"C:\\TestDir\\mes.txt","Message received");/g"            *.scr
也就是说,将所有出现的
Else
替换为
“Else FILE\u WRITE(\'C:\TestDir\mes\uuu.txt”,“Message received”);”

但替代方案如下所示:

Else  FILE_WRITE("C:TestDir^@mes.txt); 

我遗漏了什么?

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

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

您现在拥有的:

$ echo "s/Else/Else FILE_WRITE(\"C:\TestDir\mes.txt","Message received");/g"
bash: syntax error near unexpected token `)'
你想要什么:

$ 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
将来,尝试使用单引号而不是双引号。然后,您可以在不转义的情况下写入:

$ 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
Perl灵活的q和qq操作符也很有用:

$ perl -e 'print q{A double quote looks like this -> "}'
A double quote looks like this -> "

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

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

您现在拥有的:

$ echo "s/Else/Else FILE_WRITE(\"C:\TestDir\mes.txt","Message received");/g"
bash: syntax error near unexpected token `)'
你想要什么:

$ 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
将来,尝试使用单引号而不是双引号。然后,您可以在不转义的情况下写入:

$ 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
Perl灵活的q和qq操作符也很有用:

$ perl -e 'print q{A double quote looks like this -> "}'
A double quote looks like this -> "

仍然在更换后,反斜杠丢失。以下是更换后的文件。Else文件写入(“C:TestDirmes.txt”,“消息已接收”);您也必须从Perl中转义斜杠。单引号对Windows cmd.exe shell没有任何意义,因此您不能使用它们引用参数。一件方便的事情是,在许多地方,Windows将接受“C:/TestDir/mes.txt”而不是“C:\TestDir\mes.txt”。这可能会使引用更容易处理。但在替换后,反斜杠仍然丢失。以下是更换后的文件。Else文件写入(“C:TestDirmes.txt”,“消息已接收”);您也必须从Perl中转义斜杠。单引号对Windows cmd.exe shell没有任何意义,因此您不能使用它们引用参数。一件方便的事情是,在许多地方,Windows将接受“C:/TestDir/mes.txt”而不是“C:\TestDir\mes.txt”。这可能会使引用更容易处理。