두 파일을 서로 바뀐 줄로 비교한 결과 동일한 줄이 두 번 누락된 것으로 나타났습니다.

두 파일을 서로 바뀐 줄로 비교한 결과 동일한 줄이 두 번 누락된 것으로 나타났습니다.

나는 줄이 서로 순열인 두 파일에 대한 linux diff 명령을 이해하려고 노력하고 있지만 생성되는 출력을 이해할 수 없습니다. 다음 세 가지 명령을 고려하십시오.

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

위의 신비한 diff 결과를 설명할 수 있는 사람이 있습니까?

  1. 출력에 "orange"에 대한 언급이 전혀 없는 이유는 무엇입니까?
  2. 1d0은 무슨 2a2뜻인가요?

알겠어요이 답변에서저것:

"<"는 해당 행이 file2에 없음을 나타내고, "">"는 해당 행이 file1에 없음을 나타냅니다.

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

답변1

이 보고서를 이해하려면 첫 번째 파일( )을 두 번째 파일( ) 과 동일하게 만들기 위해 diff어떤 변경 사항을 적용해야 하는지 설명하는 서술적 보고서 라는 점을 기억하세요.file1file2

구체적으로는 수단 d으로는1d0삭제그리고 수단 a으로2a2다음에 추가.

그러므로:

  • 1d0file1() 안의 1번째 줄을 삭제해야 함을 나타냅니다 apples. in 은 삭제되지 않은 경우 두 번째 파일()에 나타나는 위치가 0행임을 의미합니다 0. 즉, (뒤로) 변경하면 의 0행 뒤에 1행을 추가합니다 .1d0file2file2file1file1file2
  • 2a2현재 두 번째 행에 oranges두 번째 행( )을 추가함 을 나타냅니다 . ( 첫 번째 행을 삭제한 후 행 1로 전환합니다 .)file2file1file1oranges

답변2

다음 문서를 고려하십시오.

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

diff순서 기반이라는 점을 고려하면 작동 방식은 다음과 같습니다.

  1. difffile1합계의 첫 번째 라인 블록을 읽고 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:삭제( d) 라인을 수정하고 1-2그에 따라 라인을 file1수정합니다 .0file2
  • 3a2:추가의( a) 3행 으로file12file2
  • 4a4,5:추가의4한 줄씩file14-5file2

difffile1한 줄씩 비교 file2하고 임시 메모리의 차이를 해결합니다. 생산이 완료된 후file1 동일한 file2차이와 동일한 모든 행은 에 file1나타나는 행이 처음 나타날 때까지 언급되지 않으며 일반적으로 로 표시됩니다 . 이 경우 유사한 줄은 단 하나뿐입니다 . 내가 와 같다고 말한 것에 주목하세요 . 따라서 반대가 아니라 에 상대적 입니다.file2---orangesfile1file2file1file2

출력은 제공된 첫 번째 파일(이 경우 )을 기준으로 합니다 file1.

답변3

저기 그들이있어:

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

답변4

표준(이전) 출력 형식은 파일과 다른 텍스트 영역을 포함하지 않고 파일 간의 차이점을 표시합니다.

예를 들어, ( 1d0 <삭제)는 다음을 의미합니다 .사과첫 번째 줄에서 삭제해야 하며 file1( 2a2 >추가)는 다음을 의미합니다.사과file2두 파일이 일치하도록 두 번째 줄 에 추가해야 합니다 .

사용 가능한 문서에 info diff이에 대한 자세한 설명이 나와 있습니다.

맥락 없이 차이점 표시

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

일반 형식 세부정보

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

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

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

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

FcT 첫 번째 파일의 F 범위에 있는 줄을 두 번째 파일의 T 범위에 있는 줄로 바꿉니다. 추가 및 제거를 결합한 것과 비슷하지만 더 컴팩트합니다. 예를 들어, 5,7c8,10파일 1의 5-7행을 파일 2의 8-10행으로 변경하거나, 파일 2를 파일 1로 변경하는 경우 파일 2의 8-10행을 파일 1의 8-10행으로 변경하는 것을 의미합니다. 7.

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

또한보십시오:


따라서 오렌지를 보려면 나란히 구별하거나 통합된 컨텍스트를 사용해야 합니다.

예에서:

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

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples

관련 정보