web-dev-qa-db-ja.com

差分出力の理解

私が持っています 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 @@意味ですか?

106
Jim

最初のdiff出力(いわゆる "normald diff")の意味は次のとおりです

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

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

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

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

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

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

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

113
John Smith

概要

diff file1 file2の場合、<file2に行がないことを意味し、>file1に行がないことを意味します。 3d25a5は無視できます。これらは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つのタイプがあります。それぞれは、最初のファイルの行番号またはコンマ区切りの行範囲、行う変更の種類を示す1文字、および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
29
terdon

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

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

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

コマンドラインスイッチの意味は次のとおりです。

-r:再帰的

-:行番号を表示します

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

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

5
Ravi

上記の答えは良いです。しかし、初心者としては少し理解が難しいことに気づき、さらに詳しく調べてみると、非常に役立つリンクが見つかりました。 Linux Diff Command&Examples

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

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

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

以下のケースのそれぞれがよく説明されています:

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

5
userAsh

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

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 -as)--- N行目、---(a dd( 'insert')更新ラインU

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


Change = 'remove&insert'。

2,4c5,6 --- R(s)-cs)---削除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コマンドの追加であり、挿入ではありませんが、最終的にファイルに対して行われている挿入を考えると、より役立ちます。彼らはストリーム操作を使用していますが、結果の観点から考えるのが好きです。

4
Elliptical view