2009-06-09 254 views
2

在一组大文件中,我需要将所有出现的“\”替换为“\\”。我想用Perl来达到这个目的。现在,我有以下几点:Perl正则表达式:用双反斜杠替换所有反斜杠

perl -spi.bak -e '/s/\\/\\\\/gm' inputFile 

此命令为suggested给我,但它会导致没有变化INPUTFILE(除更新的时间戳)。思考这个问题可能是,“\” S没有被空白包围,我试图

perl -spi.bak -e '/s/.\\./\\\\/gm' inputFile 

同样,这对文件没有影响。最后,我想我可能会丢失一个分号,所以我试过:

perl -spi.bak -e '/s/.\\./\\\\/gm;' inputFile 

这也没有效果。我知道我的文件包含“\” S,例如在下面一行:

("C:\WINDOWS\system32\iac25_32.ax","Indeo audio) 

我不知道是否有与正则表达式的问题,或者如果事情是错的,我的方式调用Perl。我对正则表达式有一个基本的理解,但是在涉及到Perl时,我是绝对的初学者。

这里有什么明显的错误吗?我注意到的一件事是,尽管inputFile大小大约为10MB,但命令很快返回。

回答

8

在命令行中处理反​​斜杠的难点在于知道有多少进程将操作命令行 - 以及它们的引用规则是什么。

在Unix上,在任何shell下,您显示的第一条命令行都可以工作。

您似乎在Windows上,并且在那里,您有DOS命令'shell'来处理。

我把替换成一个文件,并传递给Perl:

#!/bin/perl -spi.bak 
s/\\/\\\\/g; 

这应该做的伎俩 - 另存为“subber。PL”然后运行:

perl subber.pl file1 ... 
1

这应该如何取代所有\与\ s。

s/\\/\\\\/g 
+0

你\是转义字符,所以\\被视为一个文字\ – Copas 2009-06-09 21:11:39

0
perl -spi.bak -e 's/.\\./\\\\/gm;' inputFile 

可能? 你为什么键入那个领导/?

1
perl -pi -e 's/\\/\\\\/g' inputfile 

将取代所有的人都在一个文件中

+0

哦,和inputfile可以是一个模式,所以这可以修改所有文件在一个镜头 – 2009-06-09 21:18:23

1

s/\\/\\\\/g 

作品对我来说

你已经有了一个叛徒/在正则表达式开头的替换标志前面

不使用

.\\. 

否则将垃圾无论是前后文件后\

-1

你似乎是在Windows和 那里,你必须在DOS命令 “壳'来处理。

希望我不会分裂头发,但Windows已经很长一段时间没有用DOS。我认为我(大约1999/2000)是DOS的最后一个版本,或者是DOS下的版本。 “命令”外壳程序自XP(一种DOS模拟)以来由cmd.exe控制,但在命令外壳程序中运行perl单行程程序的作用可能仍与在DOS外壳程序中运行它们相同。也许有人可以验证。