2016-10-13 13 views
0

私は、perlスクリプトの一部としてテキストファイルの2行を一つずつコメントアウトしようとしています。最初の行は常にfile:///で始まるので、見つけた正規表現を書くのは簡単ですが、2行目は任意のテキストにすることができますので、最初の行に一致する正規表現を使用しようとしています(改行\n)その後、次の改行まで。しかし、私はそれを最初の行以上に一致させることはできません。上記の行の情報に基づいて行を変換するPerl正規表現

s/^(file:\/\/\/.*)\n(.*)/\% $1\n\% $2/g; 

大変助けてください!

+0

を*と*あなたが求めるパターンの末尾の境界をどのように定義できますか? –

+0

@WiktorStribiżewさて、後続境界は2行目の終わりになると思います。申し訳ありませんが、私は非常に多くの正規表現の初心者です... – jan

+0

[OK]を、行ごとにデータを読み取っていますか?はいの場合は、2行を1パターンに一致させることはできません。 –

答えて

2

は、おそらくこれは、何が必要です:

my $data = "Smth\nfile:///myfile\nstring\nsmthelse\n"; 
$data =~ s/(file:\/\/\/.*?)\n(.*?)\n/\% $1\n\% $2\n/s; 
print $data 

出力:

Smth 
% file:///myfile 
% string 
smthelse 

だから、あなたのような1つの文字列にファイルを読むことができます: my $str = join '', <$fh> と、それを処理するためにsキーで正規表現を行います単一の行として。 Read


EDIT:あなたは、すべての行で、あなたは私が上記したように述べた2行を変更したいのほか、いくつかのものを行う場合
は、あなたがそうすることができます。

... 
$data =~ s/(file:\/\/\/.*?)\n(.*?)\n/\% $1\n\% $2\n/s; 
$file_str = $1; 
$afterfile_str = $2; 
my @data_arr = split /\n/, $data; 
for(@data_arr) { 
    # some code, perhaps using $file_str and $afterfile_str 
    print $fh_out $_ . "\n"; 
} 
+0

これを統合する方法を教えてください。これまでのところ私のスクリプトは '$ fh_inと' $ fh_out'を開き、 'while(<$fh_in>)'ブロックに複雑なものを入れ、 'print $ fh_out $ _;'あなたのコードが前に行くと仮定します一方、それは私に "私の" "エラーでグローバル$ 1を使用することはできませんでした。 – jan

+0

これは機能しました!私はあなたのコードをwhileブロックの前に置くだけです(スマッシングなし)。 '$ data'の後ろに'; 'がありませんでした。私はそれを盲目的にコピーしました:)それはエラーでした。本当にありがとう! – jan

+0

申し訳ありませんが、今は他の変換をやり直していません。つまり、 'while'ブロック内のすべてを無視しているようです。 – jan

関連する問題