나는 줄이 서로 순열인 두 파일에 대한 linux diff 명령을 이해하려고 노력하고 있지만 생성되는 출력을 이해할 수 없습니다. 다음 세 가지 명령을 고려하십시오.
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
위의 신비한 diff 결과를 설명할 수 있는 사람이 있습니까?
- 출력에 "orange"에 대한 언급이 전혀 없는 이유는 무엇입니까?
1d0
은 무슨2a2
뜻인가요?
알겠어요이 답변에서저것:
"<"는 해당 행이 file2에 없음을 나타내고, "">"는 해당 행이 file1에 없음을 나타냅니다.
그러나 출력에서 오렌지가 누락된 이유는 설명되지 않습니다.
답변1
이 보고서를 이해하려면 첫 번째 파일( )을 두 번째 파일( ) 과 동일하게 만들기 위해 diff
어떤 변경 사항을 적용해야 하는지 설명하는 서술적 보고서 라는 점을 기억하세요.file1
file2
구체적으로는 수단 d
으로는1d0
삭제그리고 수단 a
으로2a2
다음에 추가.
그러므로:
1d0
file1
() 안의 1번째 줄을 삭제해야 함을 나타냅니다apples
. in 은 삭제되지 않은 경우 두 번째 파일()에 나타나는 위치가 0행임을 의미합니다0
. 즉, (뒤로) 변경하면 의 0행 뒤에 1행을 추가합니다 .1d0
file2
file2
file1
file1
file2
2a2
현재 두 번째 행에oranges
두 번째 행( )을 추가함 을 나타냅니다 . ( 첫 번째 행을 삭제한 후 행 1로 전환합니다 .)file2
file1
file1
oranges
답변2
다음 문서를 고려하십시오.
file1
:
# cat file1
apples
pears
oranges
peaches
file2
:
# cat file2
oranges
apples
peaches
ananas
banana
diff
순서 기반이라는 점을 고려하면 작동 방식은 다음과 같습니다.
diff
file1
합계의 첫 번째 라인 블록을 읽고file2
동일한 라인을 찾으십시오.file1 file2 differences on left (<) or right side (>) apples <apples pears <pears ------------------------------- ->oranges ->oranges peaches apples peaches ananas banana
이제 두 파일에서 동일한 모든 줄을 건너뜁니다.
oranges
이 경우는 다음과 같습니다.file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges ------------------------------- ->peaches ->apples peaches ananas banana
이제 다른 유사한 줄 세트를 찾아 차이점을 인쇄해 보세요.
file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges apples >apples ------------------------------- ->peaches ->peaches ananas banana
비슷한 줄 건너뛰기
file1 file2 differences on left (<) or right side (>) apples <apples pears <pears oranges oranges apples >apples peaches peaches ------------------------------- -> ->ananas banana
가능하다면 동일한 줄을 찾아 차이점을 인쇄하세요.
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
수정합니다 .0
file2
3a2
:추가의(a
)3
행 으로file1
2
file2
4a4,5
:추가의4
한 줄씩file1
4-5
file2
diff
file1
한 줄씩 비교 file2
하고 임시 메모리의 차이를 해결합니다. 생산이 완료된 후file1
동일한 file2
차이와 동일한 모든 행은 에 file1
나타나는 행이 처음 나타날 때까지 언급되지 않으며 일반적으로 로 표시됩니다 . 이 경우 유사한 줄은 단 하나뿐입니다 . 내가 와 같다고 말한 것에 주목하세요 . 따라서 반대가 아니라 에 상대적 입니다.file2
---
oranges
file1
file2
file1
file2
출력은 제공된 첫 번째 파일(이 경우 )을 기준으로 합니다 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