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

时间:2009-09-29 09:09:53

标签: 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_WRITE(\"C:\TestDir\mes_.txt","Message received");"的所有出现

但是替换被认为如下:

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

我错过了什么?

1 个答案:

答案 0 :(得分:5)

这实际上是一个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 -> "