2011-12-21 7 views
3

私はPerlの1つのライナーで次の置換を持っている:Perl:変数をグループ化した後、どのように数字を挿入しますか?

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/$123424977\t/g if $. <= 200' 

問題は、私はグループ化された正規表現(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)によって捕獲されたテキストの後に番号23424977を挿入したいということです。

しかし、Perlは私がグループ$ 123424977を参照していると思います! Perlにグループ$ 1を欲して、その後にテキストを挿入するにはどうすればいいですか?あなたは明確に変数名— ${1}の代わり$1区切るために中括弧を使用することができます

答えて

5

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200' 
1

サラウンドを使用{}

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200' 
                   _____^^
1

別の方法:すべてのグループを使用して、あなたの置換が$&23424977\tあなたはまた、より読みにあなたの正規表現を書き換えることができ

3

$&s///演算子の左側の部分にマッチしたフルテキストを参照)ことしないでください/エレガントな方法:

perl -pi.bak -e 's/((?:.*?\t){9})/${1}23424977\t/g if $. <= 200' 
2

一つは全く$1要件を廃止する\Kフラグを使用することができます。

s/(?:.*?\t){9}\K/23424977/g 

しかしありますオートスプリットを使ってこれを行うもっとPerlishの方法はありませんか?それを行う方法は複数ありますが、いくつかは他の方法よりも便利です:

$ perl -F/\t/-api.bak -e '[email protected],9,0,23423977 if $. < 200; $_ = join "\t", @F;' 
関連する問題