Linux에서 두 파일의 공백 차이


15

diff와 비교할 때 모든 줄이 변경되었음을 보여주는 두 개의 파일이 있습니다. diff -w공백을 무시하고 비교 하면 몇 가지 최소한의 변경 사항이 표시됩니다.

분명히 각 파일의 공백에는 약간의 차이가 있지만 그 파일이 무엇인지, 어떻게 찾는 지 모르겠습니다. 공백이 실제로 공백 문자 (탭이 아닌)인지 확인하기 위해 파일을 편집하려고했지만 다른 작업이 확실하지 않습니다.

vim을 사용 :set list on하여 줄 끝에 후행 공간이 없음을 확인했습니다.

vim이 ^M줄 끝에 표시하지 않았기 때문에 각 파일에는 Linux 줄 종결자가 있다고 생각합니다 .


1
후행 공백을 확인 했습니까 (줄 끝에)? 이러한 공간은 감지 diff되지만 많은 편집자는 기본적으로이 공간을 표시하지 않습니다.
John1024

좋은 제안. vim을 ": set list on"과 함께 사용하여 줄 끝에 "$"를 표시했으며 후행 공백이 없었습니다. 질문을 업데이트하겠습니다
Romski

당신이 경우 vim사용자, 당신은 사용하여 시도가 vimdiff file1 file2차이가 무엇인지 볼 수?
John1024

@ John1024 나는 vimdiff를 알지 못했지만 유망한 것처럼 보입니다. 답변으로 추가하고 동의합니다
Romski

1
Vim은 유닉스 줄 끝을 잘못 감지했을 때만 ^ M을 표시하지만 파일에는 실제로 DOS 줄 끝이 있습니다. 일반적으로 단일 파일에서 줄 끝이 혼합되어있는 경우 (예 : 원본 파일과 다른 줄 끝이있는 패치 적용) 경우에 발생합니다. vim이 DOS 줄이 올바르게 끝나는 것을 감지하면 ^ M을 표시하지 않았을 것입니다.
Lie Ryan

답변:


7

를 들어 vim사용자, 파일 사이의 정확한 차이를 보여줄 수있는 편리한 유틸리티가있다 :

vimdiff file1 file2

그러면 각 파일이 창에 나란히 표시되고 색상이 강조된 차이가 표시됩니다.

때 유용한 명령 vimdiff

에있는 동안 vimdiff유용한 명령은 다음과 같습니다.

  • ]c: 다음 변경으로 이동

  • [c: 이전 변경으로 이동

  • ctrl-W ctrl-W: 다른 창으로 전환

  • zo: 폴드

  • zc: 접힌 주름

다음의 예 vimdiff에서 xterm의 비교 두 가지 버전의 cups구성 파일 :

여기에 이미지 설명을 입력하십시오

동일한 선의 긴 섹션이 축소 된 것을 볼 수 있습니다. 로 다시 열 수 있습니다 zo.

색 구성표는 옵션 설정에 따라 다릅니다. 위의 예에서 한 줄은 한 파일에는 나타나지만 다른 파일에는 나타나지 않으면 그 줄에는 진한 파란색 배경이 지정됩니다. 다른 파일에서 누락 된 줄은 점선으로 표시됩니다. 두 파일에 선이 나타나지만 약간의 차이가있는 경우, 선의 변경되지 않은 부분은 분홍색 배경을 가지며 변경된 부분은 빨간색 배경을 갖습니다.


14

FreeBSD 또는 대부분의 Linux 시스템에서 diff의 출력을 파이프 라인하여 cat -v -e -t공백 차이를 표시 할 수 있습니다 .

diff file1 file2 | cat -vet

탭은 다음과 같이 표시됩니다 ^IA는, $당신이 공백을 후행 볼 수 있도록 각 줄의 끝에 표시되며, 인쇄되지 않는 문자로 표시됩니다 ^XM-X.

대부분의 비 busbox Linux 배포판에서 사용 가능한 GNU coreutils가있는 경우 다음과 같이 단순화 할 수 있습니다.

diff file1 file2 | cat -A

비지 박스 시스템에서는을 사용하십시오 catv -vet.


2

파일 중 하나가 Windows 시스템에서 편집 되었습니까?

Windows의 표준 라인 종료는 CRLF입니다 .Linux에서는 단순히 LF입니다 (Mac에서는 CR 이었지만 이전에는 OS X 이후로 변경된 것으로 보입니다).

wc -l파일을 시도 하고 몇 줄을보고 크기 차이가 줄 수와 같은지 확인하십시오 (한 줄에서 한 줄로 끝나지 않을 수 있음).


빠른 답변 감사합니다. 줄 수를 수행하면 하나의 파일에 5 줄이 더 있음을 알 수 있습니다 (편집 할 때 예상됩니다). Linux 컴퓨터에서 파일 하나를 얻었고 다른 하나는 코드 저장소에서 Linux로 체크 아웃했습니다. vim에서 Windows 터미네이터가있는 파일을 볼 때 마지막 문자는 ^ M으로 표시되며 그렇지 않습니다.
Romski

3
vim은 실제로 회선 종료를 자동 감지하기에 충분히 똑똑 합니다. 자세한 내용 은 stackoverflow.com/questions/3852868 을 참조하십시오.
fencepost

나는 그것을 몰랐다! 다시 확인
하겠습니다

2

od도움이 될 수 있습니다. Octal Dump 명령은 16 진수로 내용을 표시 할 수 있습니다. 이것은 널 바이트 또는 예기치 않은 공백을 포함하여 파일에있는 바이트를 확인하는 데 도움이됩니다. 가능한 일반적인 원인은 LF 대 CRLF, 탭 대 공백 또는 ASCII 대 유니 코드 (일반적으로 보이는 각 바이트 앞에 null 바이트가있을 수 있음) 일 수 있습니다. od -x filename이러한 패턴 중 하나를 밝혀야합니다. 파일을보다 정교하게 볼 수있게하려면 "16 진 편집기"를 잘 활용하십시오. 좋은 점은 명령 od과 마찬가지로 cut많은 유닉스 시스템에 내장되어 있다는 것입니다. 따라서 종종 별도의 설치가 필요하지 않습니다.

파일이 더 유사해야하는 경우 tr약간 변경 sed하고 더 많이 만들 수 있습니다. 먼저 ls -l어떤 파일이 더 큰지 확인한 다음 바이트를 확인하여 변경해야 할 내용을 확인한 다음 파일 중 하나를 변경하여 더 비슷하게 보이게합니다.


1

실제 공백과 탭의 위치를 ​​확인하려면 sed예를 들어 다음과 같이 대체하십시오 .

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

이제 두 파일을 비교하십시오.


더 좋은 방법은 diff 출력에서 ​​해당 필터를 실행할 수 있다는 것입니다. 또는 superuser.com/a/913368/37154 에서 cat와 같이 기성품 필터를 사용할 수 있습니다
clacke

0

다음 내용은 Romski가 작성한 위의 "질문"섹션에서 복사 한 것입니다.

모두 vimdiffdiff file1 file2 | cat -A도구 + 관점에서 매우 유용했다.

마지막으로, 나는 또 다른 문제를 발견했다. 내 파일 중 일부는 UTF-8 BOM으로 인코딩되었습니다. 이것은를 사용하여 강조되었습니다 diff file1 file2 | cat -A. 이것은 M-oM-;M-?영향을받는 파일의 시작과 같이 나타납니다 .

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

여러 가지 문제가 있었지만 파일을 정리해야하는 사람들을 위해 몇 가지 명령을 아래에 나열했습니다.

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.