[text] ‘diff'(또는 기타)를 사용하여 텍스트 파일 간의 문자 수준 차이 가져 오기

나는 ‘diff’를 사용하여 문자 차이와 문자 차이를 모두 얻고 싶습니다. 예를 들어 다음을 고려하십시오.

파일 1

abcde
abc
abcccd

파일 2

abcde
ab
abccc

diff -u 사용 하면 다음을 얻습니다.

@@ -1,3 +1,3 @@
 abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file

그러나 그것은 이러한 라인의 변화만을 보여줍니다. 내가보고 싶은 것은 다음과 같습니다.

@@ -1,3 +1,3 @@
 abcde
-ab<ins>c</ins>
-abccc<ins>d</ins>
\ No newline at end of file
+ab
+abccc
\ No newline at end of file

당신은 내 표류를 얻습니다.

이제 다른 엔진 을 사용 하여 특정 라인의 차이를 표시 / 확인할 수 있다는 것을 알고 있습니다 . 하지만 차라리 모든 작업을 수행하는 하나의 도구를 사용하고 싶습니다.



답변

Git에는 diff라는 단어가 있으며 모든 문자를 단어로 정의하면 효과적으로 문자 차이를 얻을 수 있습니다. 그러나 개행 변경은 무시 됩니다.

다음과 같은 저장소를 만듭니다.

mkdir chardifftest
cd chardifftest
git init
echo -e 'foobarbaz\ncatdog\nfox' > file
git add -A; git commit -m 1
echo -e 'fuobArbas\ncat\ndogfox' > file
git add -A; git commit -m 2

이제 수행 git diff --word-diff=color --word-diff-regex=. master^ master하면 다음을 얻을 수 있습니다.

git diff

추가 및 삭제 모두 문자 수준에서 인식되는 반면 개행 문자의 추가 및 삭제는 모두 무시됩니다.

다음 중 하나를 시도해 볼 수도 있습니다.

git diff --word-diff=plain --word-diff-regex=. master^ master
git diff --word-diff=porcelain --word-diff-regex=. master^ master


답변

당신이 사용할 수있는:

diff -u f1 f2 |colordiff |diff-highlight

스크린 샷

colordiffUbuntu 패키지입니다. 을 사용하여 설치할 수 있습니다 sudo apt-get install colordiff.

diff-highlightgit에서 가져온 것입니다 (버전 2.9부터). 에 있습니다 /usr/share/doc/git/contrib/diff-highlight/diff-highlight. 당신은 당신의 $PATH.


답변

프로그래밍 방식으로이 작업을 수행하려면 Python의 difflib 가 ace입니다. 대화식 사용을 위해 저는 vim의 diff 모드를 사용합니다 (사용하기에 충분히 쉬움 :으로 vim 호출 vimdiff a b). 나는 또한 간혹 Beyond Compare를 사용하는데 , 이것은 diff 도구에서 기대할 수있는 거의 모든 것을 수행합니다.

이 작업을 유용하게 수행하는 명령 줄 도구는 없지만 Will이 언급했듯이 difflib 예제 코드가 도움이 될 수 있습니다.


답변

cmpSolaris에서 다음 명령을 사용할 수 있습니다 .

cmp

두 파일을 비교하고 다른 경우 첫 번째 바이트와 행 번호가 다른 부분을 알려줍니다.


답변

Python에는 difflib질문에 답하는 데 도움이 될 수있는 편리한 라이브러리 가 있습니다.

다음은 difflib다른 파이썬 버전에 사용하는 두 개의 oneliner 입니다.

python3 -c 'import difflib, sys; \
  print("".join( \
    difflib.ndiff( \
      open(sys.argv[1]).readlines(),open(sys.argv[2]).readlines())))'
python2 -c 'import difflib, sys; \
  print "".join( \
    difflib.ndiff( \
      open(sys.argv[1]).readlines(), open(sys.argv[2]).readlines()))'

이것들은 .NET으로 이동하기 쉬운 쉘 별칭으로 유용 할 수 있습니다 .${SHELL_NAME}rc.

$ alias char_diff="python2 -c 'import difflib, sys; print \"\".join(difflib.ndiff(open(sys.argv[1]).readlines(), open(sys.argv[2]).readlines()))'"
$ char_diff old_file new_file

그리고 더 읽기 쉬운 버전으로 독립형 파일에 넣습니다.

#!/usr/bin/env python2
from __future__ import with_statement

import difflib
import sys

with open(sys.argv[1]) as old_f, open(sys.argv[2]) as new_f:
    old_lines, new_lines = old_f.readlines(), new_f.readlines()
diff = difflib.ndiff(old_lines, new_lines)
print ''.join(diff)


답변

cmp -l file1 file2 | wc

나를 위해 잘 작동했습니다. 결과의 가장 왼쪽 숫자는 다른 문자 수를 나타냅니다.


답변

또한 Longest 공통 하위 시퀀스 알고리즘을 사용하여이 문제를 해결하기 위해 자체 스크립트작성 했습니다 .

그렇게 실행됩니다.

JLDiff.py a.txt b.txt out.html

결과는 빨간색과 녹색 색상의 html입니다. 더 큰 파일은 처리하는 데 기하 급수적으로 더 많은 시간이 걸리지 만 이것은 먼저 한 줄씩 확인하지 않고 문자별로 진정한 문자 비교를 수행합니다.