'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 --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
colordiff
Ubuntu 패키지입니다. 을 사용하여 사용할 수 있습니다 sudo apt-get install colordiff
.
diff-highlight
git에서 것 것입니다 (버전 2.9부터). 에 있습니다 /usr/share/doc/git/contrib/diff-highlight/diff-highlight
. 당신은 당신의 $PATH
.
프로그래밍 방식으로이 작업을 수행해야합니다. Python의 difflib 가 ace입니다. 대화식 사용을 위해 저는 vim의 diff 모드를 사용합니다 (사용 가능한 사용 가능 쉬움 :으로 vim 호출 vimdiff a b
). 나는 또한 비교를 사용하는 것 이상으로 , 이것은 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
나를 위해 잘 작동했습니다. 결과의 가장 중요한 숫자는 다른 문자 수를 나타냅니다.
또한 가장 긴 하위 시퀀스 알고리즘 공통을 사용 하여이 문제를 해결하기 위해 자체 펼쳐 를 작성 했습니다 .
그렇게 실행됩니다.
JLDiff.py a.txt b.txt out.html
결과는 빨간색과 녹색 색상이있는 html입니다. 더 큰 파일은 처리하는 데 기하 급수적으로 더 많은 시간이 걸리지 만 이것은 먼저 한 줄씩 확인하지 않고 문자별로 진정한 문자 비교를 수행합니다.
컬러, 문자 수준 diff
출력
아래 스크립트와 diff-highlight (git의 일부)로 할 수있는 작업은 다음과 같습니다 .
#!/bin/sh -eu
# Use diff-highlight to show word-level differences
diff -U3 --minimal "$@" |
sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
diff-highlight
( 강조 표시에 대한 @retracile의 답변에 대한 크레딧 sed
)
파이썬의 difflib는 이것을 할 수 있습니다.
설명서에는 사용자를위한 예제 명령 줄 프로그램이 포함 되어 있습니다.
정확한 형식은 지정한 형식이 아니지만 ndiff 스타일 출력을 구문 분석하거나 예제 프로그램을 수정하여 표기법을 생성하는 것은 간단합니다.
다음은 온라인 텍스트 비교 도구입니다. http://text-compare.com/
다른 모든 문자를 강조 표시하고 나머지를 계속 비교할 수 있습니다.
저는 더 간단한 해결책이 항상 좋은 해결책이라고 생각합니다. 제 경우에는 아래 코드가 많은 도움이됩니다. 다른 사람에게 도움이되기를 바랍니다.
#!/bin/env python
def readfile( fileName ):
f = open( fileName )
c = f.read()
f.close()
return c
def diff( s1, s2 ):
counter=0
for ch1, ch2 in zip( s1, s2 ):
if not ch1 == ch2:
break
counter+=1
return counter < len( s1 ) and counter or -1
import sys
f1 = readfile( sys.argv[1] )
f2 = readfile( sys.argv[2] )
pos = diff( f1, f2 )
end = pos+200
if pos >= 0:
print "Different at:", pos
print ">", f1[pos:end]
print "<", f2[pos:end]
선호하는 터미널에서 다음 구문으로 두 파일을 비교할 수 있습니다.
$ ./diff.py fileNumber1 fileNumber2
파일을 Git에 보관하는 경우 diff-highlight 스크립트를 사용하여 버전간에 차이를 표시 할 수 있습니다.이 스크립트 는 차이점이 강조 표시된 다른 행을 표시합니다.
불행히도 제거 된 줄 수가 추가 된 줄 수와 일치 할 때만 작동합니다. 줄이 일치하지 않는 경우에 대한 스텁 코드가 있으므로 나중에 수정할 수 있습니다.
완전한 대답은 아니지만 cmp -l
의 출력이 충분히 명확하지 않은 경우 다음을 사용할 수 있습니다.
sed 's/\(.\)/\1\n/g' file1 > file1.vertical
sed 's/\(.\)/\1\n/g' file2 > file2.vertical
diff file1.vertical file2.vertical
이 답변의 대부분은 Perl 모듈 인 diff-highlight 사용을 참조 합니다. 하지만 저는 Perl 모듈을 설치하는 방법을 알고 싶지 않습니다. 그래서 필자는 자체 포함 된 Perl이 어느 정도 변경했습니다.
다음을 사용하여 사용할 수 있습니다.
▶ curl -o /usr/local/bin/DiffHighlight.pl \
https://raw.githubusercontent.com/alexharv074/scripts/master/DiffHighlight.pl
그리고 사용법 ( colordiff
zhanxw 답변에의 우분투가 언급 된 경우 ) :
▶ diff -u f1 f2 | colordiff | DiffHighlight.pl
그리고 사용법 (그렇지 않은 경우) :
▶ diff -u f1 f2 | DiffHighlight.pl
'ProgramingTip' 카테고리의 다른 글
무한 이미지를 찾기위한 알고리즘 (0) | 2020.10.14 |
---|---|
Selenium RC로 Google 크롬을 실행하는 방법은 무엇입니까? (0) | 2020.10.14 |
헤드리스 Linux의 "android update sdk" (0) | 2020.10.14 |
PHP의 strtotime ()과 동등한 Javascript? (0) | 2020.10.14 |
자바 상속 상속 : 슈퍼 생성 장비 체인을 사용합니까? (0) | 2020.10.14 |