1

更新:

我可以让这个问题更简单地解决:

我想弄清楚用两个反斜杠替换任何一次出现的反斜杠的正确正则表达式是什么。

我想转这个:

vlc.plugin.path = C:\Program Files\JekyllV0.9.2\\VLC_1.0.0\\plugins

进入:

vlc.plugin.path = C:\\Program Files\\JekyllV0.9.2\\VLC_1.0.0\\plugins

原始问题:

我想使用 Perl Regex 在文件中更改以下内容:

  • 所有出现的单个反斜杠到两个反斜杠
  • 所有出现的单个正斜杠到两个反斜杠

我尝试了以下方法:

perl" -p -i.orig -e "s#\\#\\\\#g" -e "s#/#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%

其中 %VIDEOLOG_PROPERTIES_FILE% 包含:

vlc.plugin.path = C:\Program Files\JekyllV0.9.2/VLC_1.0.0/plugins
4

5 回答 5

6

对于基本替换:

perl -p -i.orig -e "s#[/\\]#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%

要仅替换不与同一字符的另一个实例相邻的斜杠和反斜杠:

perl -p -i.orig -e "s#(?<!/)/(?!/)#\\\\#g; s#(?<\\)\\(?!\\)#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%
于 2009-08-20T19:02:01.203 回答
4

你想要File::Spec->canonpath

更新::实际上,这是错误的建议。这将适用于内部函数调用等,但它会将单个反斜杠写入文件。但是,以下将更好地工作:

#!/usr/bin/perl

use strict;
use warnings;

use Config::INI::Reader;

my $config = Config::INI::Reader->read_handle(\*DATA);

my $var1 = $config->{_}->{'vlc.plugin.path1'};
my $var2 = $config->{_}->{'vlc.plugin.path2'};

for my $v ($var1, $var2) {
    $v =~ s! (?: [\\]{1,2} ) | (?:/) !\\\\!gx;
    print "$v\n";
}

__DATA__
vlc.plugin.path1 = C:\Program Files\JekyllV0.9.2\\VLC_1.0.0\\plugins
vlc.plugin.path2 = C:\Program Files\JekyllV0.9.2/VLC_1.0.0/plugins

输出:

C:\\Program Files\\JekyllV0.9.2\\VLC_1.0.0\\plugins
C:\\Program Files\\JekyllV0.9.2\\VLC_1.0.0\\plugins
于 2009-08-20T21:02:51.910 回答
3

我很确定 Perl 会盲目地连接它的所有-e参数,所以这些参数被压缩成s#\\#\\\\#gs#/#\\\\#g,然后第二个正则表达式看起来像一个注释。

如果我将其更改为-e 's#\\#\\\\#g; s#/#\\\\#g'.

当然,您可以使用单个正则表达式来执行此操作,因为您两次都使用相同的替换。

于 2009-08-20T19:02:39.550 回答
3

它不起作用,因为 perl 不处理两个-e标志——两个命令之间没有分号。你必须写如下(如果你在'perl'之后丢失了d-quote,那就是。)

perl -p -i.orig -e "s#\\#\\\\#g;" -e "s#/#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%

我做了类似的事情,但是因为 Perl'/'在 PC 上支持,所以我更喜欢正斜杠。所以我使用以下内容:

s![\\/]+!/!g;

因此它可以很容易地转向

s![\\/]+!\\\\!g;

现在谈谈我为什么这样做:有时人们不知道他们是否应该在将要连接的部分路径的开头或结尾放置一个斜线。有时你甚至会得到双斜杠。(但如果您使用File::Spec则不会。)因此处理这些类型的冲突是件好事。尤其是因为这将是一条路径,所以我们想要采取任何类型的斜线并将它们变成我们喜欢的类型。

此外,我什至这样做:

s!([\\/]+([.][\\/]+)?)+!/!g

因为它捕获了由一个点分隔的同一个斜杠簇但什么都不做的情况,因为对于那些处理路径名中的点的程序和脚本,路径方式/<=> ,而其他程序将出错。(/+.)+

于 2009-08-20T19:27:54.367 回答
0
[21:09:00][mgrad@zuza-3:~]$ perl -pe 's#\/#\/\/#g; s#\\#\\\\#g' test.txt
vlc.plugin.path = C:\\Program Files\\JekyllV0.9.2//VLC_1.0.0//plugins
于 2009-08-20T19:09:32.093 回答