2016-05-20 14 views
0

htmlファイルのコードを繰り返し処理し、特定の繰り返しテキストを見つけて単語と繰り返し番号を追加する方法を教えてください。複数の文字列が検索され、繰り返し番号が付加されます。

So: 
<!-- TemplateBeginEditable --> 
<!-- TemplateBeginEditable --> 
<!-- TemplateBeginEditable --> 
etc...      

Becomes : 
<!-- TemplateBeginEditable Event=1 --> 
<!-- TemplateBeginEditable Event=2 --> 
<!-- TemplateBeginEditable Event=3 --> 
etc... 

私はPERLが最も簡単で速いと思って、jQueryに行ってからPERLに戻った。

REGEXで多くの方法を見つけたり置き換えたりするのは簡単なようですが、反復変数を付けることは難しい問題です。

私が試したものの最新例:

#!/usr/bin/perl -w 

# Open input file 
open INPUTFILE, "<", $ARGV[0] or die $!; 
# Open output file in write mode 
open OUTPUTFILE, ">", $ARGV[1] or die $!; 

# Read the input file line by line 
while (<INPUTFILE>) { 
    my @matches = ($_ =~ m/TemplateBeginEditable/g); 
    ### what do I do ith matches array? ### 
    $_ =~ s/TemplateBeginEditable/TemplateBeginEditable Event=/g; 
    print OUTPUTFILE $_; 

} 


close INPUTFILE; 
close OUTPUTFILE; 
+0

は、「私はそれが最も簡単/最速とバックPERLに、その後のjQueryに行き、ことだろうと考えPERLを試してみました。」 PerlやjQueryのいずれかを選択するのは正確に何を編集していますか? Template ToolkitのようなPerlテンプレートツールを使用していますか? – ThisSuitIsBlackNot

+0

'perl -lpi.bkp -e's/TemplateBeginEditable /" $&Event = " ++ $ i/ge 'file.html'はそれを行うための単純な一行です。しかし、これがもう少し複雑なプロジェクトの場合は、これがほんの一部ですが、最小限に厳格と警告を有効にしてより完全に実現されたプログラムに展開するべきです。 –

+0

私は残念ながら、Dreamweaverテンプレート/ Adob​​e Contribute "CMS"システムを慎重に使用しています。私は手動で200個の編集可能な領域の検索/置換+を手動で行うことは望まない。だから、コードは実稼働環境には存在しないだろう。上記の1つのライナーは、受け入れられるソリューションと同様であり、有効である可能性があります。 – JohnnyP

答えて

1

置換を実行するには、以前にパターンを一致させる必要はなく、置換を直接実行することができます。あなたのコードを持つ例:それは短くすることができますようにするには

my $i; 

while (<INPUTFILE>) { 
    s/TemplateBeginEditable(?{ ++$i })/TemplateBeginEditable Event=$i/g; 
    print OUTPUTFILE $_; 
} 

while (<INPUTFILE>) { 
    s/TemplateBeginEditable/TemplateBeginEditable Event=/g; 
    print OUTPUTFILE $_; 
} 

各交換時にインクリメントカウンタを追加するには、次の構文を使用してパターン自体にコードの一部を置くことができます試合の結果の開始を変更する\K機能を使用します。

while (<INPUTFILE>) { 
    s/TemplateBeginEditable\K(?{ ++$i })/ Event=$i/g; 
    print OUTPUTFILE $_; 
} 

または1-ライナー付き:

あなたが利用可能 awkを持っており、対象のテキストだけで最大で1回行につき発生した場合
perl -pe 's/TemplateBeginEditable\K(?{++$i})/ Event=$i/g' file > output 
+0

ここで2番目と3番目の例では、 "my $ i"に対して$ i = 1を宣言する必要はありませんが、各繰り返しで1を加えることはできますか? – JohnnyP

+0

@ JohnnyP:交換に使用する前に '$ i'がインクリメントされて(*' $ $ ')*されているので、あなたは必要ありません。 '$ i = 0'を書くことは役に立たない。 –

+0

この1本のライナーは私の目的のために働く。私はKスイッチを完全に理解していませんが、グーグルリングの後でさえも。ありがとう! – JohnnyP

0

をコメントで私のワンライナーで拡大:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $file = shift or die "Usage: $0 <filename>\n"; 

open my $fh, '<', $file or die "Cannot open $file: $!\n"; 
open my $ofh, '>', "$file.modified" or die "Cannot open $file.modified: $!\n"; 

my $i = 1; 
while (my $line = <$fh>) { 
    if ($line =~ s/TemplateBeginEditable/$& Event=$i/) { 
     $i++; 
    } 
    print $ofh $line; 
} 

__END__ 

注意これは、あなたの複数のインスタンスを持つことはありませんと仮定していることサンプル入力に示されているように、1行に目的のテキストを入力します。

1

は、その後、Perlは行き過ぎだと思いますされています

awk 'BEGIN{n=1}{n+=sub("TemplateBeginEditable","& Event="n)}1' 

いくつかの説明:sub関数は(行っ置換の数を返します。 0または1)。 &は「一致するものは何でも」を意味します。 "..."nは文字列連結です(awkでは演算子なし)。 1は、デフォルトの「アクション」を{print}と呼び出す「真の」条件です。

0

私はちょうど行いたい:

local $/=undef; 
my $content = <FH>; 
my $x = 0; 
$content =~ s/(My expected pattern)/$1 . " time=" . (++$x)/ge; 
関連する問題