代码之家  ›  专栏  ›  技术社区  ›  Dr. Faust

如何在Perl中规范化Windows文件路径?

  •  1
  • Dr. Faust  · 技术社区  · 15 年前

    更新:

    我想知道用两个反斜杠替换任何一个反斜杠的正确正则表达式是什么。

    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" -p -i.orig -e "s#\\#\\\\#g" -e "s#/#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%
    

    vlc.plugin.path = C:\Program Files\JekyllV0.9.2/VLC_1.0.0/plugins
    
    5 回复  |  直到 12 年前
        1
  •  6
  •   chaos    15 年前

    对于基本替换:

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

    要仅替换不与同一字符的另一个实例相邻的斜杠和反斜杠,请执行以下操作:

    perl -p -i.orig -e "s#(?<!/)/(?!/)#\\\\#g; s#(?<\\)\\(?!\\)#\\\\#g" %VIDEOLOG_PROPERTIES_FILE%
    
        2
  •  4
  •   Sinan Ünür    15 年前

    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
    
        3
  •  3
  •   Eevee    15 年前

    我敢肯定Perl盲目地将所有 -e 争论,所以这些都被压在 s#\\#\\\\#gs#/#\\\\#g

    如果我把它改成 -e 's#\\#\\\\#g; s#/#\\\\#g' .

    当然,你可以用一个正则表达式来实现,因为你两次都使用相同的替换。

        4
  •  3
  •   Axeman maxelost    15 年前

    -e 标志——两个命令之间没有分号。必须按如下方式编写(如果在'perl'后面丢失了d引号,也就是说。)

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

    我做了一些类似的事情,但是因为Perl支持 '/' 在电脑上,我更喜欢前斜杠。因此,我使用以下内容:

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

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

    现在来说说我为什么这么做:有时人们不知道是否应该在连接的部分路径的开头或结尾加上斜线。有时你甚至会有两次前斜杠。(但如果你使用 File::Spec )因此处理这种碰撞是很好的。特别是因为这将是一条道路,我们想采取任何形式的削减,并把他们变成我们喜欢的类型。

    此外,我甚至这样做:

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

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

        5
  •  0
  •   name    15 年前
    [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