2011-01-28 9 views
3

単純なテキスト置換を使用して、あるシンボルを別のシンボルに名前変更したソースファイルがあるとします。そのファイルのdiff出力は、通常かなり長く、何が起こったかの非常に有用な識別子ではありません。あなたが知りたいのは、変更が単純にs/a/b/gだった場合です。もしそうならば、abは、あなたがこのツールを事前に話しているわけではありません。 (引数として、 'a'と 'b'に改行が含まれていないと仮定できます)ファイルの検索と置換操作の特定

  • 検索と置き換えにはどのようなアルゴリズムを使用しますか? (簡単)
  • いくつかのテキストの置換が行われた場合、どのように動作させるのですか? (かなり簡単)
  • 元のファイルを比較しないで、どのようにdiff出力で動作するように書きますか? (かなり難しい)
  • 検索/置換ではなく正規表現マッチを特定するか?
  • このような変更が他のファイルと一緒に含まれているファイルでは、sed式を生成し、diffを大幅に短縮するヒューリスティックを思いつくことができますか? (ハード)

これは、アルゴリズムの設計のように、私が使用したい実際のツールに基づいているため、疑問があります。そうすれば、素晴らしいコマンドラインツール上記のボーナスポイントのいずれかを行います。 ;)私は今考える

+0

正規表現について言えば、元の文字列の一部が置換文字列で再利用された可能性はありますか?これは、正規表現による単純な検索よりもはるかに難しくなると思いますが、定数演算に置き換えられます(おそらく、リストに2つの異なる項目を書くことができます)。 –

+0

ちょっと考えました。 's/programmer/developer 'の後に' s/program/executable'を続けると 'programmer'に違った影響を与えます。操作は単語全体(プログラミング言語のトークン)にのみ影響すると考えてよいでしょうか? –

+0

私は、あなたの状態が制限されている限り、単純なケースでもこれを解決することができてうれしいです。私は、一般的なケースで正規表現のマッチを見つけることは可能ではないと思います。検索置換のペアが重複していれば、合理的なアルゴリズムは実際に使用されたものとは異なる検索/置換のセットを思いつくでしょう。しかし、現時点での解決策の欠如を考えると、部分的な回答でさえも、何の答えよりも優れているわけではないので、あなたの前提を明記し、そこから出てください。 – ijw

答えて

1

つのオプション:

  • 実行/s/b/a/g、それは明らかに
  • 独自の差分ツールを作成します)あなたの正規表現に誤りを見つけませんが(ファイルのdiffを、それが動作します差異として表示せずに一定の変更を受け入れます(つまり、行が異なり、一方の行がa、もう一方がbのみ異なる場合は、行をマークしないでください)
+0

ああ、私は任意の変更を意味しました。あなたがツールを実行している時点であなたが知らないものです。それを反映するように質問が更新されました。 – ijw

1

Darcs (distributed version control system)にはそのような変更のための特別な処理があるため、アルゴリズムのアルゴリズムはあります。だから彼らのドキュメントを見てみたり、質問してみてください。アルゴリズムを再利用することは、Haskellに書かれているので、やや難しいかもしれません。

+0

ドキュメントのスキムの中で最も速いのは、置き換えを実行する特別な置換コマンドと置換を行ったフラグ(http://darcs.net/manual/Best_practices.html#SECTION00514000000000000000)を使用することを示唆していますその効果から。私はここで間違っているかもしれない、心。 – ijw