1

アップデート:

これを解決するためのより簡単な問題にすることができます:

1 つのバック スラッシュを 2 つのバック スラッシュに置き換える正しい正規表現を理解したいと思います。

私はこれを変えたい:

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 を使用してファイル内の以下を変更したい:

  • 1 つのバック スラッシュから 2 つのバック スラッシュまでのすべての出現
  • 単一のスラッシュから 2 つのバック スラッシュまでのすべての出現

私は次のことを試しました:

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 は 2 つのフラグを処理しないため ( -e2 つのコマンドの「間に」セミコロンがなければ) 動作しません。以下のように書く必要があります ('perl' の直後の d-quote をなくした場合、つまり)。

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

私も似たようなことをしていますが、Perl は'/'PC でサポートしているので、私の好みはスラッシュです。だから私は以下を使用します:

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

したがって、簡単に向きを変えることができます

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

ここで、私がそうする理由について一言: 連結されるパスの一部の先頭または末尾にスラッシュを配置する必要があるかどうかを判断できない場合があります。場合によっては、スラッシュが 2 つになってしまうこともあります。(ただし、 File::Specを使用する場合はそうではありません。) したがって、この種の衝突を処理するのは良いことです。特にパスになるので、どんな種類のスラッシュでも好きな種類に変えたいと思います。

さらに、私もこれを行います:

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

/パス名のドットを処理するプログラムとスクリプトのパスごとの<=>(/+.)+が、他のプログラムがエラーになるため、ドットで区切られた同じスラッシュのクラスターである場合をキャプチャするためです。

于 2009-08-20T19:27:54.367 に答える
3

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

に変更するとうまくいきます-e 's#\\#\\\\#g; s#/#\\\\#g'

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

于 2009-08-20T19:02:39.550 に答える
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 に答える