차이점 출력 이해

차이점 출력 이해

나는 가지고있다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의 줄 번호입니다. 그러면 3d2file1.txt의 3번째 줄이 삭제되었고 2번째 줄이 file2.txt에 있다는 것을 알 수 있습니다(또는 더 좋게 말하면, 삭제 후 줄 카운터가 2번째 줄로 돌아갑니다). 5a5file1.txt의 라인 5(이전 작업에서 라인을 삭제한 후 실제로 비어 있음)에서 시작하여 해당 라인을 추가했으며 추가된 라인은 file2.txt의 라인 5라는 것을 알려줍니다.

명령의 출력 형식은 diff -u약간 다릅니다(소위 "통합 diff" 형식). 여기서는 diff두 개의 별도 텍스트가 아닌 하나의 텍스트로 제공됩니다. 이 줄의 @@ -1,5 +1,5 @@일부는 -1,5file1.txt와 관련되고 일부 +1,5는 file2.txt와 관련됩니다. 그들은 이것이 difffile1.txt의 라인 1에서 시작하여 5라인 길이의 텍스트를 표시할 것이라고 말합니다 . file2.txt에서도 마찬가지입니다. diff1행부터 시작하는 5행이 표시됩니다.

이미 말했듯이 두 파일의 줄은 함께 표시됩니다.

 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 일반 포맷에 대한 자세한 설명

일반 출력 형식은 하나 이상의 차이점 세트로 구성됩니다. 각 블록은 파일의 다른 영역을 표시합니다. 일반 형식의 잘생긴 남자는 다음과 같습니다.

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

변경 명령에는 세 가지 유형이 있습니다. 각 파일에는 첫 번째 파일의 줄 번호 또는 쉼표로 구분된 줄 범위, 수행할 변경 유형을 나타내는 단일 문자, 두 번째 파일의 줄 번호 또는 쉼표로 구분된 줄 범위가 포함됩니다. 모든 줄 번호는 각 파일의 원래 줄 번호입니다. 변경 명령의 유형은 다음과 같습니다.

`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) 또한 이러한 명령 이름 변경은 무슨 일이 일어나고 있는지 생각하는 데 도움이 될 수 있습니다.

대표하다그렇긴 하지만'제거하다'무슨 일이 일어나고 있는지 더 명확하게 만듭니다.
대표하다으응,...하지만'끼워 넣다'무슨 일이 일어나고 있는지 더 명확하게 만듭니다.

대표하다옷걸이=+또는 "삭제+삽입".


다음과 같이 사용하세요:

2,41 또는 일반 D(들)--N=삭제('제거하다') D 라인. 그런 다음 두 라인의 N개 라인을 동기화합니다.

42,4 또는 일반적으로 N--U(s) = 라인 N에서,dd('끼워 넣다') 행 U를 업데이트합니다.

참고: 이 두 매개변수는 거의 대칭입니다. 왼쪽에서 오른쪽으로만 반전되어 있습니다.


2,45,6 또는 일반 R(들)--U(s) = R(s) 행을 삭제하고 해당 위치에 업데이트된 U(s) 행을 삽입합니다.


예를 들어:

42,4는 4부터 시작하여 업데이트된 행 2-4를 추가(삽입)하는 것을 의미합니다.(즉, "2,4"는 2, 3, 4행을 의미합니다.)

2,41은 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 함수의 차이점을 보여줍니다.

-피(대문자) : 파일이 여러 개인 경우 전체 경로를 표시합니다.

관련 정보