为什么我的反斜杠在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”。这可能会使引用更容易处理。