同じツールの2つの異なるバージョンによって生成されるプロジェクトの2つのTCL表現があります。それらをv1.tcl
およびv2.tcl
と呼びましょう。
これらのログは通常、行の順序を除いて、すべての目的と目的で論理的に同一です。プロジェクトのバージョン1と2が同じである場合、v1.tcl
のすべての行がv2.tcl
で1回だけ見つかりますどこか。
誰かがv2.tcl
に変更を加えてv1.tcl
にバックポートする必要があるかどうか(またはその逆)を識別できるようにしたい...つまり、私だけがしたいのです。一致しない行を参照してください。例えば:
v1.tcl
:
foo1
bar1
hello1
world1
v2.tcl
:
hello1
bar1
foo2
world1
goodbye2
「diff」の戻り値:
file1:1 foo1
file2:3 foo2
file2:5 goodbye2
自分の小さなスクリプトを書くだけでいいですか?すでにこれを行っているツールはありますか?
行が同一で、ifファイルに余分な行がある場合にのみ知りたい場合は、sort&diff(およびプロセス置換)を使用できます。ここに):
$ diff -B <(sort v1.tcl) <(sort v2.tcl)
2c2,3
< foo1
---
> foo2
> goodbye2
空白行を無視するには、diffの-B
を使用します。次に、grep -n [pattern] file
を使用して、パターンがどの行にあるかを見つけることができます(おそらく、grep
、cut
、sed
、awk
)、それが重要な場合。
これはより完全な答えであり、一致を含むファイルと行番号を示しています。 sedやawkを使用せず、bash、cut、grepを使用します...これがすべて(基本的に)1行にまとめられています。
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line; do if \
echo "$line" | grep -q "^<"; then grep -F -n -H \
"$(echo "$line"|cut -c3-)" v1.tcl ; Elif echo "$line" | grep -q \
"^>"; then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl ; fi done
または複数の行に分割します。
diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line
do
if echo "$line" | grep -q "^<"
then grep -F -n -H "$(echo "$line"|cut -c3-)" v1.tcl
Elif echo "$line" | grep -q "^>"
then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl
fi
done
また、入力ファイルに応じて(特に、末尾に円記号が付いた行がある場合)、readとgrepに次のオプションを使用しています。
read -r
バックスラッシュが文字をエスケープできないようにするgrep -F
PATTERNを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切ります。いずれも一致します。また、 Pimp Juice IT's コメントを使用して、入力ファイルの行に末尾の円記号がある場合、grepは「file:line末尾の円記号」エラーを返します。 grepの-F
オプションを使用して、末尾のバックスラッシュエラーをクリアすると、grepのみのソリューションがはるかに小さくなります。
grep -FvHn -f v2.tcl v1.tcl ;grep -FvHn -f v1.tcl v2.tcl
使用されるgrepのオプション:
-f
FILEから1行に1つずつパターンを取得します。-F
PATTERNを(正規表現ではなく)固定文字列のリストとして解釈し、改行で区切ります。いずれも一致します。-v
一致する意味を反転して、一致しない行を選択します。-H
一致するたびにファイル名を出力します-n
出力の各行の前に入力ファイル内の1から始まる行番号を付けます。