전환 된 줄이있는 diff 두 파일의 결과 같은 줄이 두 번 누락되었다고 표시


28

두 줄의 파일이 서로 순열되어 있지만 생성 된 출력을 파악할 수없는 두 파일의 linux diff 명령을 이해하려고합니다. 아래의 세 가지 명령을 고려하십시오.

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

누군가 diff의 위의 암호 출력을 설명 할 수 있습니까?

  1. 출력에 "오렌지"에 대한 언급이없는 이유는 무엇입니까?
  2. 무엇 1d02a2의미합니까?

나는 이 답변에서 다음을 이해 합니다.

"<"는 file2에서 행이 누락되었음을 의미하고 ">"는 file1에서 행이 누락되었음을 의미합니다.

그러나 출력에서 ​​오렌지가 누락 된 이유를 설명하지는 않습니다.


12
oranges두 파일 사이의 공통 부분이 가장 크기 때문에 두 파일 간의 차이점을 표현하는 가장 짧은 방법입니다.
Stéphane Chazelas

10
더 읽기 쉬운 출력을 원하면 diff -u file1 file2대신 사용하십시오. 이를 "통합 diff"형식이라고합니다. 원래 diff 형식은 매우 간결한 형식이지만 통합 된 diff는 훨씬 더 읽기 쉽습니다.
godlygeek

4
@godlygeek 또는diff -y file1 file2
user80551

답변:


27

보고서를 이해하려면 diff첫 번째 파일 ( file1)을 두 번째 파일 ( file2) 과 동일하게 만들기 위해 어떤 변경을 수행해야하는지 설명하는 규정을 명심하십시오 .

특히 din 1d0delete 를, ain 2a2add 를 의미 합니다 .

그러므로:

  • 1d0(1 ) 은 file1( apples) 에서 삭제해야합니다 . 0in 1d0행 0은 두 번째 파일 ( file2)에서 삭제되지 않았을 때 나타납니다. 그 수단은 변화 될 때 file2까지 file1의 (거꾸로) APPEND 라인 (1) file1라인 이후의 0 file2.
  • 2a2수단은 제 라인 (추가 oranges)에서 file2의 현재 번째 라인을 file1(첫 번째 행을 삭제 한 후 file1, oranges1 라인으로 전환)

무엇 01d0?
Geek

@Geek 내 편집 내용보기
혼돈

1
@Geek 그러나 뇌에 매듭을 만들 수 있습니다 조심 =)
혼돈

그것은 실제로 매듭을 만들기 시작했습니다 :-)
Geek

13

다음 파일을 고려하십시오.

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

diff주문 기반으로 작동 하는 방식 :

  1. difffile1and 의 첫 번째 블록을 읽고 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: ( ) 줄 을 삭제 하고 그에 따라 줄 을 수정하십시오.d1-2file10file2
  • 3a2: 추가] ( a라인) 3file1라인 2file2
  • 4a4,5: 추가]은 라인에 4file1라인 4-5file2

diff줄 단위로 비교 file1하고 file2임시 메모리의 차이를 해결합니다. 한 후 file1 동일 file2 의 행의 처음 발견 될 때까지 file1도에 발생 file2하는 차이를 언급되지 않은 때까지 동일한까지 모든 라인들은로 표시 ---. 이 경우 비슷한 줄이 하나만 oranges있습니다. 내가과 file1동일 하다고 말 file2했으므로 다른 방향으로 보지 않고 file1상대적 file2으로 보았습니다.

이 경우 출력은 주어진 첫 번째 파일과 관련이 file1있습니다.


2
초기 설명이 마음에 들지 않습니다 apples. 두 파일 모두에서 발생합니다.
또는 매퍼

1
@ORMapper 설명을 변경했습니다. 더 명확하게 / 더 나은 소리로 들립니까 :)?
polym

지금까지는 "유사한 한 줄만 있습니다"라고 썼습니다 oranges. 틀린 : 실제로 줄 이 있는데 , 이것들은 비슷할 뿐만 아니라 완전히 동일합니다 . 그들 중 하나는 읽고 oranges다른 하나는 읽습니다 apples. 또한 귀하의 설명 (순전히 주문 기반)은 질문에 대한 Stéphane 의 의견 (길이 기반) 과 모순됩니다 -누가 맞습니까?
또는 매퍼

@ORMapper "이 경우"와 그 이전 줄을 잊어 버렸습니다. 나는이 단계에서 하나의 비슷한 줄 만 있음을 의미했습니다. 더 잘 이해할 수 있도록 대답에 예를 추가하겠습니다.
polym

1
@ORMapper 또한 길이 기반 답변이 정확하다는 것을 보여주는 예를 들어 줄 수 있습니까?
polym

8

저기 그들이있어:

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

8

표준 (오래된) 출력 형식은 파일이 다른 영역으로 텍스트를 둘러싸 지 않고 파일 간의 차이를 표시합니다.

예를 들어 : 1d0 <(삭제)는의 첫 번째 줄에서 사과 를 제거해야 file1하고 2a2 >(추가) 는 두 번째 줄에 사과 를 추가해야 file2하므로 두 파일을 모두 일치시킬 수 있음을 의미합니다.

info diff자세한 내용 은 다음 문서를 참조하십시오.

컨텍스트없이 차이점 표시

"정상" diff출력 형식은 주변 컨텍스트없이 각 차이를 보여줍니다. 때때로 이러한 출력은 근처의 변경되지 않은 행을 어지럽히 지 않고 행이 어떻게 변경되었는지 확인하는 가장 명확한 방법입니다 (0 행의 컨텍스트를 사용하여 컨텍스트 또는 통합 형식으로 유사한 결과를 얻을 수 있음). 그러나이 형식은 더 이상 패치를 보내는 데 널리 사용되지 않습니다. 이를 위해 컨텍스트 형식과 통합 형식이 우수합니다. 표준 형식은 이전 버전 diff및 POSIX 표준과의 호환성을위한 기본값입니다 . --normal이 출력 형식을 명시 적으로 선택하려면 옵션을 사용하십시오 .

일반 형식에 대한 자세한 설명

일반 출력 형식은 하나 이상의 차이로 구성됩니다. 각 덩어리는 파일이 다른 하나의 영역을 보여줍니다. 일반 형식 덩어리는 다음과 같습니다.

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

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

LaR 첫 번째 파일의 L 행 다음에 두 번째 파일의 R 범위에있는 행을 추가하십시오. 예를 들어, 8a12,15파일 1의 8 행 다음에 파일 2의 12-15 행을 추가하는 것을 의미합니다. 또는 파일 2를 파일 1로 변경하는 경우 파일 2의 12-15 행을 삭제하십시오.

FcT 첫 번째 파일의 범위 F에있는 행을 두 번째 파일의 범위 T에있는 행으로 바꾸십시오. 이것은 결합 된 추가 및 삭제와 비슷하지만 더 컴팩트합니다. 예를 들어, 5,7c8,10파일 1의 5-7 행을 변경하여 파일 2의 8-10 행으로 읽습니다. 또는 파일 2를 파일 1로 변경하는 경우 파일 2의 8-10 행을 변경하여 파일 1의 5-7 행으로 읽습니다.

RdL 첫 번째 파일에서 범위 R의 행을 삭제하십시오. L 행은 삭제되지 않은 두 번째 파일에 나타난 위치입니다. 예를 들어, 5,7d3파일 1의 5-7 행을 삭제합니다. 또는 파일 2를 파일 1로 변경하는 경우 파일 2의 3 행 뒤에 파일 1의 5-7 행을 추가하십시오.

참조 :


따라서 오렌지를 보려면 나란히 또는 통합 된 컨텍스트를 사용하여 차이를 만들어야합니다.

예를 들면 다음과 같습니다.

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.