나는 ‘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 --word-diff=plain --word-diff-regex=. master^ master
git diff --word-diff=porcelain --word-diff-regex=. master^ master
답변
답변
프로그래밍 방식으로이 작업을 수행하려면 Python의 difflib 가 ace입니다. 대화식 사용을 위해 저는 vim의 diff 모드를 사용합니다 (사용하기에 충분히 쉬움 :으로 vim 호출 vimdiff a b
). 나는 또한 간혹 Beyond Compare를 사용하는데 , 이것은 diff 도구에서 기대할 수있는 거의 모든 것을 수행합니다.
이 작업을 유용하게 수행하는 명령 줄 도구는 없지만 Will이 언급했듯이 difflib 예제 코드가 도움이 될 수 있습니다.
답변
cmp
Solaris에서 다음 명령을 사용할 수 있습니다 .
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입니다. 더 큰 파일은 처리하는 데 기하 급수적으로 더 많은 시간이 걸리지 만 이것은 먼저 한 줄씩 확인하지 않고 문자별로 진정한 문자 비교를 수행합니다.