2009-08-20 7 views
1

アップデート:私はこの単純な問題を解決することができますPerlでWindowsファイルパスを正規化するにはどうすればよいですか?

私は正しい正規表現は、2つのバックスラッシュとバックスラッシュのいずれか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の正規表現を使用してファイルに次のように変更したい

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

    %のVIDEOLOG_PROPERTIES_FILE%は含まれています:2への単一のバックスラッシュの

  • すべての出現は戻って戻って、私は次のことを試してみました

をスラッシュ単一前方の

  • すべてのオカレンスが2にスラッシュスラッシュ基本のために

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

    を...と何が起こったのか? – chaos

    +0

    MSWindowsがこれらの処理をどのように処理しているかわかりませんが、バックスラッシュをもう一度エスケープしてみてください。#\\\\#\\\\\\#g – Inshallah

    +0

    "...何が起こったのですか? - カオス" 。ええ、それはPerlのことです。 (ちょうど私がPerlのように冗談を言う;-)) – p4bl0

    答えて

    6

    置き換える:

    同じ文字の別のインスタンスに隣接して表示されていないだけでスラッシュとバックスラッシュを置き換えるために
    perl -p -i.orig -e "s#[/\\]#\\\\#g" %VIDEOLOG_PROPERTIES_FILE% 
    

    perl -p -i.orig -e "s#(?<!/)/(?!/)#\\\\#g; s#(?<\\)\\(?!\\)#\\\\#g" %VIDEOLOG_PROPERTIES_FILE% 
    
    +0

    これは、Faustがすでに試みたこととは違う理由を説明できますか? –

    +1

    @Rob:まず、構文エラーは発生しません。 Eeveeが答えて言ったように、最初の置換にセミコロンを追加することで修正することができます。カオスは2つの正規表現を文字クラスで組み合わせることで簡単にします。私はあなたが示唆したものを使用する場合 – Telemachus

    +0

    は私が取得:vlc.plugin.path = Cを:\\プログラムファイル\\ JekyllV0.9.2 \\\\ VLC_1.0.0 \\\\プラグイン は、既存の変更を回避する方法はあります"\\"から "\\\\"に? –

    3

    私はPerlは盲目的にそのすべての-e引数を連結し、ので、それらはに押しつぶされているかなり確信していますs#\\#\\\\#gs#/#\\\\#g、そして2番目の正規表現はコメントのように見えます。

    私が-e 's#\\#\\\\#g; s#/#\\\\#g'に変更すると、私のために働きます。

    もちろん、同じ置換を両方使用しているので、1つの正規表現でこれを行うことができます。

    0
    [21:09:00][[email protected]:~]$ perl -pe 's#\/#\/\/#g; s#\\#\\\\#g' test.txt 
    vlc.plugin.path = C:\\Program Files\\JekyllV0.9.2//VLC_1.0.0//plugins 
    
    3

    perlは2つの-eのフラグを処理しないので、動作しません - 二つのコマンド「間」セミコロンなし。あなたは

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

    私は似た何かを(。あなたは正しい」perlの後にD-見積もりを失った場合、それはある)以下のようにそれを記述する必要がありますが、PerlはPC上で'/'をサポートしているので、私の好みはのためにありますスラッシュ。だから私は、次のようにします。

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

    したがって、それは簡単に今、私は理由について単語こと

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

    に振り向いすることができます。時々、人々は、彼らは置くべきかどうかを把握することはできません連結されるパスの最初または最後のスラッシュ。時には二重のスラッシュでさえ終わることがあります。 (ただし、File::Specを使用していない場合)、この種の衝突を処理することは良いことです。特に道筋になるので、どんな種類のスラッシュでも好きな種類に変えたいと思っています。

    また、私もこれを行う:

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

    をそれはそれは何もしません、ドットで区切られたスラッシュの同じクラスタのこれらのケースをキャプチャしているので、それらのプログラムのパスワイズ/ < =>(/+.)+理由パス名のドットを扱うスクリプト、他のプログラムはエラーになります。

    +0

    これは本当に正しくありません。 Perlは2つの '-e'節をうまく扱います。それがしないのは、それらの間に暗黙のセミコロンを挿入することです。 – chaos

    +0

    @chaosあなたは*絶対に*正しいです、私はPerlにコマンドセパレータを置くように伝えなければならないことに驚いています。私はいつも動作しないという機能的な前提を持っていました。しかし、私はそれを試して、それは私が試したすべてのプラットフォームで働いた。ありがとう! – Axeman

    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 
    
    +0

    ありがとうございます。これは非常に有益で有用でした。 –

    関連する問題