差分出力の理解


89

私は持っています file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

そして file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

もしそうなら:diff file1.txt file2.txt私は得る:

3d2  
< line3  
5a5  
> GNU is not UNIX  

出力は一般的にどのように解釈されますか?私は考えて<削除を意味しますが何をするの3d2か、5a5意味ですか?

私が行った場合:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

結果はより明確ですが、どういう@@ -1,5 +1,5 @@意味ですか?

回答:


98

最初のdiff出力(いわゆる「normall diff」)での意味は次のとおりです。

< -file1.txtの行を示します

> -file2.txtの行を示します

3d25a5影響を受ける行番号と実行されたアクションを示します。dは削除、a追加(およびc変更)を表します。文字の左側の番号はfile1.txtの行番号、右側の番号はfile2.txtの行番号です。したがって3d2、file1.txtの3行目が削除され、file2.txtに行番号2があることを示します(または、削除後、行カウンターが行番号2に戻ったと言ってもいいでしょう)。5a5file1.txtの行番号5から開始し(前のアクションで行を削除した後に実際に空だった)、行を追加し、この追加された行はfile2.txtの番号5であることがわかります。

diff -uコマンドの出力は少し異なってフォーマットされています(いわゆる「統合diff」フォーマット)。ここでdiffは、2つの個別のテキストではなく、1つのテキストを示しています。この行で@@ -1,5 +1,5 @@は、パーツ-1,5はfile1.txtに関連し、パーツ+1,5はfile2.txtに関連しています。彼らはそれを教えdiffFILE1.TXTに行番号1から始まる5行の長さでテキストの一部を、表示されます。そして、file2.txtについても同じです-1 diff行目から始まる5行を示しています。

すでに述べたように、両方のファイルの行は一緒に表示されます

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

ここで-は、file1.txtから削除され+た行と、追加された行を示しています。


25

まとめ

与えられたdiff file1 file2<ラインがで不足していることを意味file2し、>ラインがで不足していることfile13d2そして5a5、彼らはのためのコマンドです、無視することができpatch、多くの場合で使用されていますdiff

完全な回答

多くの* nixユーティリティは、TeXinfoマニュアルとよりシンプルなmanページを提供します。info commandたとえば、次のコマンドを実行してこれらにアクセスできますinfo diff。この場合、関心のあるセクションは次のとおりです。

2.4.2通常形式の詳細な説明


通常の出力形式は、1つまたは複数の相違点で構成されています。各ハンクには、ファイルが異なる1つの領域が表示されます。通常の形式のハンクは次のようになります。

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

変更コマンドには3つのタイプがあります。それぞれは、最初のファイルの行番号またはコンマで区切られた行の範囲、変更の種類を示す単一の文字、および2番目のファイルの行番号またはコンマで区切られた行の範囲で構成されます。すべての行番号は、各ファイルの元の行番号です。変更コマンドのタイプは次のとおりです。

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been

4

使用することをお勧めします:

diff -rupP file1.txt file2.txt > result.patch

次に、を読むとresult.patch、すぐに違いがわかります。

これらは、コマンドラインスイッチの意味です。

-r:再帰的

-u:行番号を表示します

-p(小):C関数の違いを表示します

-P(大文字):複数のファイルの場合、フルパスが表示されます


3

上記の答えは良いです。しかし、初心者として、私はそれらを理解するのが少し難しいと感じ、さらに検索すると、非常に便利なリンクを見つけました: Linux Diff Command&Examples

このサイトでは、コンセプトをシンプルでわかりやすい方法で説明しています。

Diffコマンドは、このように考えると理解しやすくなります。

基本的に、1つのファイルを変更して2番目のファイルと同一にする方法に関する一連の指示を出力します。

次の各ケースについて詳しく説明します。

aは追加、cは変更、dは削除


2

覚えやすいように名前を変更してください!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

結果は、編集するファイル(file1)で動作し、さまざまな更新を適用します。


同様に、これらの名前の変更は結果を概念化するのに役立ちます。

Delete = 'remove'およびAdd = 'insert'。

2,4d1 --- D(s)-d -N --- d elete( ' remove ')D行。次に、両方の行Nで同期します。

4a2,4 --- N- a -U(s)---行Nで dd( ' insert ')更新の行U

注:それらはほぼ対称です。


変更=「削除して挿入」。

2,4c5,6 --- R(s)-c -U(s)--- R(s)行を削除してから、更新された行U(s)をその場所に挿入します。



例えば:

4a2,4 --- 4から開始して、更新された行2-4を追加します(つまり、2,4は2、3、4を意味します)

2,4d1 ---行2-4を削除します。

2,4c5,6 ---行2-4を削除し、更新された行5-6を挿入


  • これらはストリームエディタコマンドであり、マシンで処理されるように設計されていることを知っています。たとえば、実際には挿入ではなくedコマンドのaddですが、最終的にファイルに対して行われる挿入を考える方が便利です。ストリーム操作を使用しますが、結果の観点から考えるのが好きです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.