
私は行が互いに順列である2つのファイルに対するlinux diffコマンドを理解しようとしていますが、生成された出力を理解できません。次の3つのコマンドを考えてみましょう。
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
上記の神秘的なdiffの結果を説明できる人はいますか?
- 出力に「orange」への言及がまったくないのはなぜですか?
1d0
とはどういう2a2
意味ですか?
わかりました。この回答ではそれ:
「<」は対応する行が file2 にないことを示し、「」>」はその行が file1 にないことを示します。
ただし、出力にオレンジが欠けている理由は説明されていません。
答え1
このレポートを理解するには、最初のファイル()を2番目のファイル()と同じにするためにどのようなdiff
変更を加える必要があるかを説明する説明的なレポートであることに注意してください。file1
file2
具体的には、手段d
として1d0
削除そして手段a
として2a2
次へ追加。
したがって:
1d0
file1
()内の1行目を削除する必要があることを示しますapples
。 inは、削除されていない場合、2番目のファイル()に表示される場所がゼロ行であることを意味します0
。つまり、(戻る)変更するとの0行の後に1行が追加されます。1d0
file2
file2
file1
file1
file2
2a2
現在の2行目にoranges
2行目()を追加することを示します。 (最初の行を削除してから行1に切り替えます。)file2
file1
file1
oranges
答え2
次の文書を検討してください。
file1
:
# cat file1
apples
pears
oranges
peaches
file2
:
# cat file2
oranges
apples
peaches
ananas
banana
diff
順序ベースであることを考慮すると、動作方法は次のとおりです。
diff
file1
合計の最初の行ブロックを読み、file2
同じ行を見つけます。file1 file2 differences on left (<) or right side (>) apples <apples pears <pears ------------------------------- ->oranges ->oranges peaches apples peaches ananas banana
これで、両方のファイルで同じすべての行をスキップします。
oranges
この場合は次のようになります。file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges ------------------------------- ->peaches ->apples peaches ananas banana
さて、他の同様の行セットを見つけて違いを印刷してみてください。
file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges apples >apples ------------------------------- ->peaches ->peaches ananas banana
同様の行をスキップ
file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges apples >apples peaches peaches ------------------------------- -> ->ananas banana
可能であれば、同じ行を見つけて違いを印刷してください。
line_file1 file1 line_file2 file2 differences on left (<) or right side (>) 1 apples <apples 2 pears <pears 3 oranges 1 oranges 2 apples >apples 4 peaches 3 peaches 4 ananas >ananas 5 banana >banana -----------------------------------------------
今これを行うdiff file1 file2
:
# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana
diff
これで、出力の意味を説明するのはとても簡単です。
file1
次のようにしてくださいfile2
:
1,2d0
:削除(d
)行を修正し、1-2
それに応じて行をfile1
修正します。0
file2
3a2
:追加(a
)3
行でfile1
2
file2
4a4,5
:追加4
一file1
行ずつ4-5
file2
diff
file1
一行ずつ比較file2
し、一時メモリの違いを解決します。生産が完了した後file1
同じ file2
違いに等しいすべての行は、に表示されるfile1
行が最初に表示されるまでは言及されておらず、一般的にマークされます。この場合、同様の行は1つだけです。私が同じだと言ったことに注意してください。したがって、反対ではなく、相対的です。file2
---
oranges
file1
file2
file1
file2
出力は、提供された最初のファイル(この場合)に基づいていますfile1
。
答え3
そこにそれらがあります:
$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges
答え4
標準(以前の)出力形式は、ファイルと他のテキスト領域を含まずにファイル間の違いを示します。
たとえば、(1d0 <
削除)は次のことを意味します。りんご最初の行から削除する必要がありfile1
(2a2 >
追加)は、次のことを意味します。りんごfile2
2つのファイルが一致するように2行目に追加する必要があります。
利用可能な文書には、info diff
その詳細な説明が記載されています。
コンテキストなしで違いを表示
「一般」
diff
出力形式は、周囲のコンテキストなしですべての違いを示しています。時には、このような出力は、近くの変更されていない行が乱れて行がどのように変更されたかを確認する最も明確な方法です(0行のコンテキストを使用して、コンテキストまたは均一な書式設定で同様の結果が得られるにもかかわらず)。ただし、この形式はもはやこの目的のためにパッチを送信するために広く使用されておらず、コンテキスト形式と統合形式の方が優れています。一般形式は、以前のバージョンとPOSIX規格と互換性のdiff
ある基本形式です。この出力形式を明示的に選択するには、この--normal
オプションを使用します。一般形式の詳細
一般的な出力形式は、1 つ以上の差分セットで構成されます。各ブロックはファイルの異なる領域を表示します。一般的な形式のハンサムな男は次のとおりです。
CHANGE-COMMAND < FROM-FILE-LINE < FROM-FILE-LINE... --- > TO-FILE-LINE > TO-FILE-LINE...
変更コマンドには 3 種類あります。各ファイルには、最初のファイルの行番号またはカンマで区切られた行の範囲、実行する変更の種類を示す単一文字、2番目のファイルの行番号、またはカンマで区切られた行の範囲が含まれています。すべての行番号は、各ファイルの元の行番号です。変更コマンドの種類は次のとおりです。
LaR
最初のファイルのL行の後に2番目のファイルのR範囲の行を追加します。たとえば、8a12,15
ファイル 2 の 12 行目から 15 行目をファイル 1 の 8 行目に追加したり、ファイル 2 がファイル 1 に変更された場合は、ファイル 2 の 12 行目から 15 行目を削除したりします。
FcT
最初のファイルのF範囲の行を2番目のファイルのT範囲の行に置き換えます。追加と削除の組み合わせと似ていますが、よりコンパクトです。たとえば、5,7c8,10
ファイル 1 の 5-7 行をファイル 2 の 8-10 行に変更したり、ファイル 2 をファイル 1 に変更した場合、ファイル 2 の 8-10 行をファイル 1 の 8-10 行に変更するを意味します。 7.
RdL
最初のファイルからR範囲の行を削除します。削除されていない場合、L行が2番目のファイルに表示されます。たとえば、5,7d3
ファイル1の行5を7から削除するか、ファイル2をファイル1に変更する場合は、ファイル1の行5を行7にファイル2の行3に追加します。
また見なさい:
したがって、オレンジを表示するには、並べて区別するか、統合されたコンテキストを使用する必要があります。
例では:
$ diff -y file1 file2
apples <
oranges oranges
> apples
$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
oranges
+apples