From: okkez Date: 2007-03-31T20:32:57+09:00 Subject: [ruby-list:43346] Re: 置換リストを読み込んでのgsub こんばんは。 okkezです。 07/03/31 に qzr00050@nifty.com さんは書きました: > > 一応、後方参照については以下のtest.rbでクリアしたつもりですが、改行文字、 > タブ文字への置換ができていません。どこか間違ってないでしょうか。あるいは、 > できないのでしょうか。 > > よろしくお願いいたします。 > 置換の仕様がよくわからなかったので、実行結果が期待どおりになるように書いてみました。 説明(とコード)から読み取れた私の解釈を書いておきます。 1. 置換リストは上から順番に実行される(一つ目の実行結果が二つ目への入力になる) 2. 置換リストにはRubyで * そのまま * 使える正規表現や文字列が記述されている 処理の内容を簡単に説明しておきます。 * ファイルの内容を一気に置換したいので、ファイルの内容は一気に読む * 置換リストは一行一要素の配列にとりあえず格納 * 置換リストの右側にはRubyでそのまま使用できる文字列が記述されているので evalで評価すれば、Rubyの文字列になる。(\n,\tが期待どおりの文字列になる) * 最初のブロック内のgsubは\1,\2がevalで変換されないようにする対策 gsub.rb ------------ txt = File.read('sample.txt') # 置換対象のファイル arr = File.readlines('table.tsv') # 置換リスト # 置換リスト変換 re = arr.map{|l| tmp = l.chomp.split("\t") [tmp.first, eval('"' + tmp.last.gsub(/(\\[0-9])/){ "\\" + $1 } + '"')] } re.each do |elem| txt.gsub!(/#{elem[0]}/mu, elem[1]) end puts '----' puts txt 実行結果は期待どおり、以下のようになります。 > 次のような結果を期待しているのですが…。 > a > [b] > c > 1abcfoo2abcbar > それでは。 -- okkez okkez000@gmail.com