2つのファイルを入れ替えた行と比較したところ、同じ行が2回欠落していることがわかりました。

2つのファイルを入れ替えた行と比較したところ、同じ行が2回欠落していることがわかりました。

私は行が互いに順列である2つのファイルに対するlinux diffコマンドを理解しようとしていますが、生成された出力を理解できません。次の3つのコマンドを考えてみましょう。

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples

上記の神秘的なdiffの結果を説明できる人はいますか?

  1. 出力に「orange」への言及がまったくないのはなぜですか?
  2. 1d0とはどういう2a2意味ですか?

わかりました。この回答ではそれ:

「<」は対応する行が file2 にないことを示し、「」>」はその行が file1 にないことを示します。

ただし、出力にオレンジが欠けている理由は説明されていません。

答え1

このレポートを理解するには、最初のファイル()を2番目のファイル()と同じにするためにどのようなdiff変更を加える必要があるかを説明する説明的なレポートであることに注意してください。file1file2

具体的には、手段dとして1d0削除そして手段aとして2a2次へ追加

したがって:

  • 1d0file1()内の1行目を削除する必要があることを示しますapples。 inは、削除されていない場合、2番目のファイル()に表示される場所がゼロ行であることを意味します0。つまり、(戻る)変更するとの0行の後に1行が追加されます。1d0file2file2file1file1file2
  • 2a2現在の2行目にoranges2行目()を追加することを示します。 (最初の行を削除してから行1に切り替えます。)file2file1file1oranges

答え2

次の文書を検討してください。

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

diff順序ベースであることを考慮すると、動作方法は次のとおりです。

  1. difffile1合計の最初の行ブロックを読み、file2同じ行を見つけます。

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
  2. これで、両方のファイルで同じすべての行をスキップします。orangesこの場合は次のようになります。

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
  3. さて、他の同様の行セットを見つけて違いを印刷してみてください。

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
  4. 同様の行をスキップ

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
  5. 可能であれば、同じ行を見つけて違いを印刷してください。

    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修正します。0file2
  • 3a2:追加a3行でfile12file2
  • 4a4,5:追加4file1行ずつ4-5file2

difffile1一行ずつ比較file2し、一時メモリの違いを解決します。生産が完了した後file1 同じ file2違いに等しいすべての行は、に表示されるfile1行が最初に表示されるまでは言及されておらず、一般的にマークされます。この場合、同様の行は1つだけです。私が同じだと言ったことに注意してください。したがって、反対ではなく、相対的です。file2---orangesfile1file2file1file2

出力は、提供された最初のファイル(この場合)に基づいていますfile1

答え3

そこにそれらがあります:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges

答え4

標準(以前の)出力形式は、ファイルと他のテキスト領域を含まずにファイル間の違いを示します。

たとえば、(1d0 <削除)は次のことを意味します。りんご最初の行から削除する必要がありfile12a2 >追加)は、次のことを意味します。りんごfile22つのファイルが一致するように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

関連情報