2 つの類似しているが微妙に異なるセクションを含むソース ファイルがあります。微妙な違いを処理するパラメーターを使用して、2 つのセクションを 1 つのサブルーチンにマージしたいと考えていますが、それらすべてを認識していることを確認して、見逃さないようにする必要があります。
このような場合に私が通常行うことは、各セクションを別のファイルにコピーしてから、tkdiff または vimdiff を使用して違いを強調することです。中間ファイルをスキップして、同じファイルの 2 つの部分だけを比較する方法はありますか?
7 に答える
Vimのlinediffプラグインはうまく機能します。ファイルの 1 つのセクションを視覚的に選択し、:Linediff
. 他のセクションを視覚的に選択し、 と入力し:Linediff
ます。vim がvimdiffモードになり、前に強調表示した 2 つのセクションのみが表示されます。入力:LinediffReset
して vimdiff モードを終了します。
より詳しい情報:
KDiff3はオープン ソースであり、Win32 や Linux などのいくつかのプラットフォームで利用できます。
これには、 Beyond Compareについて Gishu が説明している「手動アライメント」機能があります(ちなみに、私は個人的には使用していませんが、私が知っている多くの人が優れたツールと見なしています)。
その他の例については、この回答を
参照してください。
Beyond Compareを使用します。
両側の行を選択して、「手動で整列」と言うことができます。これで問題なく動作するはずです。
私は@ordnungswidrigの答えをbash関数に作り直すことにしました(私は単一のファイルとの違いにのみ興味がありましたが、これは2つの異なるファイルを処理するように簡単に変更できました...):
# ファイル内の違いを見つけて、両方のセクションの開始行と終了行を指定します 関数 diff_sections { local fname=`basename $1`; local tempfile=`mktemp -t $fname`; ヘッド -$3 $1 | テール +$2 > $tempfile && ヘッド -$5 $1 | テール +$4 | diff -u $tempfile - ; rm $tempfile; }
あなたはそのように関数を呼び出します...
diff_sections path/to/file 464 483 485 506
配置を手動で調整できる差分ツールは、その仕事をします。Diffuse ( http://diffuse.sourceforge.net/ ) は私のお気に入りで、配置を手動で調整することもできます。
正規表現と比較するセクションの開始と終了を記述できる場合は、次を使用できます。
sh -c 't=`mktemp`; cat "$0" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 > $t; cat "$1" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 | diff -u $t - ; rm $t' firstfile secondfile "section start" "section end"
別の方法として、セクションを行番号で記述したい場合は、次のようにします。
sh -c 't=`mktemp`; cat "$0" | head -$3 |tail +$2 > $t; cat "$1" | head -$5 | tail +$4 | diff -u $t - ; rm $t' first second 4 10 2 8
4 10 2 8 は、最初のファイルと 2 番目のファイルから考慮されるセクションの開始行番号と終了行番号です。
スニペットをシェル スクリプトまたはエイリアスとして保存できます。