違いの出力について

違いの出力について

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

答え1

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

<– file1.txt の行を表します。

>– file2.txt の行を表します。

3d25a5影響を受けた行番号と実行された操作を示します。d削除を示し、a追加を示します(c変更を示す)。文字の左側の数字はfile1.txtの行番号、右側の数字はfile2.txtの行番号です。これにより3d2、file1.txtの3行目が削除され、2行目がfile2.txtにあることがわかります(またはより良いことに、削除後の行カウンタは2行目に戻ります)。5a5file1.txtの5行目(以前の操作から行を削除した後は実際には空)で始まり、それが追加され、追加された行がfile2.txtの5行目であることがわかります。

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

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

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

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

答え2

一般化する:

が与えられると、行がdiff file1 file2失わ<れたことを示しますfile2>これは行がから失われたことを示しますfile1。無視できますが、3d2コマンドとともに頻繁に使用されます。5a5patchdiff

完全な答え:

多くの* nixユーティリティはTeXinfoマニュアルとより簡単なmanページを提供します。info commandたとえば、を実行してこれらの項目にアクセスできますinfo diff。この場合、興味のある部分は次のとおりです。

2.4.2 一般フォーマットの詳細な説明

一般的な出力形式は、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 
     deleted.  For example, '5,7d3' means delete lines 5-7 of file 1;
     or, if changing file 2 into file 1, append lines 5-7 of file1
     after line 3 of file 2.

答え3

1) 進行状況を覚えるのに役立つように、ファイルパラメータの名前を次のように変更します。

代わりに:

diff f1 f2    # f1=file 1, and f2=file2

考える

diff file-to-edit file-with-updates

結果のデフォルト:編集するファイル、次から更新アップデートファイル


2)また、これらのコマンド名の変更は何が起こっているのかを考えるのに役立ちます。

D代表するDそうですが、削除する'何が起こっているかをより明確にします。
代表するうん、…でも」入れる'何が起こっているかをより明確にします。

代表するハンガー=D+または「削除+挿入」。


次のように使用してください。

2,4D1 または一般 D(s)-D-N=D削除( '削除する') D ライン。次に、2行のN行を同期します。

42,4または通常N--U(s) = 行 N で、dd( '入れる') 行 U を更新します。

注:これら2つのパラメータはほぼ対称です。左から右にだけ反転しています。


2,45,6 または一般 R(s)--U(s) = R(s) 行を削除し、その位置に更新された U(s) 行を挿入します。


たとえば、

42、4は、4から始まり、更新された行2〜4を追加(挿入)することを意味します。(つまり、「2,4」は2、3、4行を意味します。)

2,4D1は、2~4行(2、3、4)を削除するという意味です。

2,45、6は、行2-4(2、3、4)を削除し、更新された行5-6(5、6)を挿入することを意味します。

答え4

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

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

そうすれば、読んでみるとresult.patchその違いがすぐにわかります。

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

-アル字型:再帰

- ゆう: 行番号を表示

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

-血(大文字): ファイルが複数ある場合、フルパスを表示します.

関連情報