पाठ फ़ाइलों के बीच वर्ण-स्तर प्राप्त करने के लिए 'diff' (या कुछ और) का उपयोग करना


93

मैं 'डिफरेंशियल' का उपयोग करना चाहूंगा, ताकि दोनों के बीच और चरित्र में अंतर हो। उदाहरण के लिए, विचार करें:

फ़ाइल 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

तुम मेरा बहाव हो जाओ।

अब, मुझे पता है कि मैं एक विशिष्ट लाइन पर अंतर को चिह्नित / जांचने के लिए अन्य इंजनों का उपयोग कर सकता हूं । लेकिन मैं इसके बजाय एक उपकरण का उपयोग करूँगा।


2
सीजेके ग्रंथों की बात आती है तो प्रति वर्ण अंतर विशेष रूप से उपयोगी है, जहां शब्द विभाजन के लिए कोई व्हाट्सएप नहीं है।
把 留 在 无 '29

जवाबों:


76

Git में एक शब्द अंतर है, और सभी वर्णों को परिभाषित करना क्योंकि शब्द प्रभावी रूप से आपको एक वर्ण भिन्नता देते हैं। हालाँकि, नए बदलावों को अनदेखा किया जाता है

उदाहरण

इस तरह एक रिपॉजिटरी बनाएं:

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 का अंतर

ध्यान दें कि कैसे परिवर्धन और विलोपन दोनों को चरित्र स्तर पर पहचाना जाता है, जबकि न्यूलाइन्स के परिवर्धन और विलोपन दोनों को अनदेखा किया जाता है।

आप इनमें से किसी एक को आज़माना चाहते हैं:

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

76
आपको एक रेपो बनाने की आवश्यकता नहीं है, आप बस अपने फाइल सिस्टम पर कहीं भी और किसी भी दो फाइलों को गिट भिन्न दे सकते हैं और यह काम करता है। आपकी आज्ञा मेरे लिए उस तरह से महान काम करती है, इसलिए धन्यवाद! git diff --word-diff=color --word-diff-regex=. file1 file2
क्वर्टीज़्गुई

1
यह गहरा मददगार है! एक सॉफ्टवेयर डेवलपर के रूप में +1 करेंगे और यदि मैं लेखक / लेखक के रूप में +1 दो बार कर सकता हूं। कोड के विपरीत, जहां पंक्तियां बहुत कम होती हैं, जब कागज / कहानियां लिखते समय, प्रत्येक पैराग्राफ एक लंबी शब्द-लिपटे लाइन का रूप ले लेता है, और यह सुविधा वास्तव में दृष्टिगत रूप से उपयोगी रूप में भिन्न बनाती है।
mtraceur

29
मुझे --no-indexऊपर git रेपो के बाहर काम करने के लिए इसे पाने के लिए ऊपर @ qwertzguys की प्रतिक्रिया को जोड़ने की आवश्यकता थी । तो:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
नाथन बेल

2
git diff सामान्य सेटिंग में काम नहीं करता है: git diff --no-index --word-diff = color --word-diff-regex =। <(इको स्ट्रिंग 1) <(इको स्ट्रिंग 2) .. कुछ नहीं, लेकिन यह काम करता है: diff --color <(इको स्ट्रिंग 1) <(इको स्ट्रिंग 2)।
मॉस

1
@ नथनबेल मुझे --no-indexएक रेपो के अंदर भी जोड़ने की ज़रूरत थी
जेएसहोरथाउस

32

आप उपयोग कर सकते हैं:

diff -u f1 f2 |colordiff |diff-highlight

स्क्रीनशॉट

colordiffएक उबंटू पैकेज है। आप इसका उपयोग करके स्थापित कर सकते हैं sudo apt-get install colordiff

diff-highlightgit से है (संस्करण 2.9 से)। में स्थित है /usr/share/doc/git/contrib/diff-highlight/diff-highlight। आप इसे अपने में कहीं भी रख सकते हैं $PATH


6
Colordiff मैक के लिए होमब्रे पर भी उपलब्ध है:brew install colordiff
एमिल स्टेनस्ट्रॉम्

5
मैक पर आप पा सकते हैं diff-highlightमें$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
StefanoP

2
यदि आप काढ़ा का उपयोग करके गिट स्थापित नहीं करते हैं - तो diff-highlightअजगर की पाइप के साथ भी स्थापित किया जा सकता है - pip install diff-highlight(मैं इसे पसंद करता हूं भले ही गिट को काढ़ा के माध्यम से स्थापित किया गया हो)
यारॉन यू।

22

यदि आप इस प्रोग्राम को करना चाहते हैं तो पायथन का डिफ्लिब इक्का है। इंटरेक्टिव उपयोग के लिए, मैं विम के विधा का उपयोग करता हूं (उपयोग करने के लिए काफी आसान है: बस के साथ विम आह्वान करें vimdiff a b)। मैं भी तुलनात्मक रूप से परे का उपयोग करता हूं , जो कि एक अलग टूल से आपके द्वारा आशा की जा सकने वाली हर चीज का बहुत अधिक उपयोग करता है।

मुझे कोई कमांड लाइन टूल दिखाई नहीं देता है, जो इसे उपयोगी बनाता है, लेकिन विल नोट्स के रूप में, difflib उदाहरण कोड मदद कर सकता है।


1
ओह .. मैं कुछ अधिक मानकीकृत (एक छिपे हुए कमांड लाइन तर्क की तरह) उम्मीद कर रहा था। लानत की बात यह है कि मेरे पास बियोंड 2 की तुलना है और यह फ़र्क / कंसोल को फ़ाइल करने के लिए टेक्स्ट आउटपुट का भी समर्थन करता है, लेकिन इसमें अभी भी केवल लाइन-डिफॉर्म्स शामिल हैं, न कि चार-डिफॉर्म्स। मैं अजगर में देखूंगा अगर किसी के पास कुछ नहीं है।
विटालिबी

6
मुझे vimdiff से परिचित कराने के लिए +1। मुझे डिफ़ॉल्ट रंग अप्राप्य लगे, लेकिन इसके लिए एक समाधान मिला stackoverflow.com/questions/2019281/… पर
अपरिभाषित

18

आप cmpसोलारिस में कमांड का उपयोग कर सकते हैं :

cmp

दो फ़ाइलों की तुलना करें, और यदि वे अलग-अलग हैं, तो पहली बाइट और रेखा संख्या बताती है कि वे कहाँ भिन्न हैं।


2
cmpलिनक्स वितरण पर (कम से कम कुछ) उपलब्ध है।
जेफ इवांस

7
यह मैक ओएस एक्स पर भी उपलब्ध है
एरिक आर। रथ

वर्ण में कई बाइट्स हो सकते हैं, और ओपी ने एक दृश्य तुलना के लिए कहा।
सेस टिम्मरमैन

1
@CeesTimmerman: cmp ध्वज के साथ दृश्य तुलना की अनुमति देता है -l -b
शाम

10

पायथन में सुविधाजनक पुस्तकालय का नाम है difflibजो आपके प्रश्न का उत्तर देने में मदद कर सकता है।

नीचे difflibअलग-अलग पायथन संस्करणों के लिए दो ऑन्लाइनर का उपयोग किया गया है।

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()))'

ये शेल उर्फ ​​के रूप में काम आ सकते हैं जो आपके साथ घूमना आसान है .${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)

बहुत बढ़िया एक लाइनर। एक संघनित उत्पादन के लिए अच्छा होगा जो अपरिवर्तित लाइनों की उपेक्षा करता है।
helpan.plenert.macdonald

6
cmp -l file1 file2 | wc

मेरे लिए अच्छा काम किया। परिणाम की सबसे बाईं संख्या भिन्न होने वाले वर्णों की संख्या को इंगित करती है।


1
या सिर्फ सबसे बाईं ओर पाने के लिए:cmp -l file1 file2 | wc -l
टोनी

5

मैंने सबसे लंबे समय तक सामान्य एल्गोरिथ्म का उपयोग करके इस समस्या को हल करने के लिए अपनी स्क्रिप्ट भी लिखी

इसे ऐसे ही अंजाम दिया जाता है

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

परिणाम HTML में लाल और हरे रंग के साथ है। बड़ी फ़ाइलों को प्रक्रिया के लिए समय की एक लंबी राशि ले लो, लेकिन यह पहली पंक्ति द्वारा जाँच लाइन के बिना चरित्र तुलना द्वारा एक सही चरित्र करता है।


मैंने पाया है कि पीएलडी के तहत जेएलडीएफ बहुत तेजी से चलता है।
यहोशू

4

रंगीन, चरित्र-स्तर diff ouput

यहां आप नीचे दी गई लिपि और अंतर-हाइलाइट (जो गिट का हिस्सा है) के साथ क्या कर सकते हैं :

रंगीन अंतर स्क्रीनशॉट

#!/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हाइलाइटिंग)


यह शेल स्क्रीन पर अच्छा अंतर दिखाता है, लेकिन मुझे GVim में वह अंतर कैसे दिखाई देता है ??
हेमंत शर्मा

1
क्या यह वास्तव में एक गंभीर सवाल है :)। command | gvim -जो चाहोगे, करोगे।
Righ

संदर्भ के लिए अंतर-हाइलाइट को शामिल किया गया है, gitलेकिन इसे आपके पथ पर नहीं रखा गया है। एक मेरी मशीन इस पर रहती है /usr/share/doc/git/contrib/diff-highlight
Righ

टूटी हुई कड़ी। मैं अलग-अलग हाइलाइट कैसे स्थापित करूं। एक पैकेज मैनेजर में नहीं लगता है।
ट्रेवर हिक्की

3

पायथन का डिफ्लिब ऐसा कर सकता है।

प्रलेखन में आपके लिए एक उदाहरण कमांड-लाइन प्रोग्राम शामिल है।

सटीक प्रारूप आपके द्वारा निर्दिष्ट नहीं है, लेकिन यह सीधे या तो ndiff- शैली आउटपुट को पार्स करने के लिए या आपके नोटेशन को उत्पन्न करने के लिए उदाहरण कार्यक्रम को संशोधित करने के लिए सीधा होगा।


धन्यवाद! मैं इस पर गौर करूंगा। मैं कुछ अधिक मानकीकृत (एक छिपे हुए कमांड लाइन तर्क की तरह) उम्मीद कर रहा था। लेकिन यह अभी भी ठीक कर सकता है। मैं अजगर में देखूंगा यदि किसी के पास कुछ अधिक मानक नहीं है (हालांकि ऐसा लगता है कि नहीं)।
विटालिबी

2

यहाँ एक ऑनलाइन पाठ तुलना उपकरण है: http://text-compare.com/

यह हर एक चार को उजागर कर सकता है जो अलग है और बाकी की तुलना जारी रखता है।


ऐसा प्रतीत होता है कि लाइन-लेवल एकल वर्णों के लिए कोई विकल्प नहीं है। पात्रों की तुलना करने के लिए आपको यह कैसे मिलता है?
ड्रैगन

आह; यह उन पात्रों को उजागर करता है जो अलग हैं। लेकिन यह अभी भी उस में लाइन-लेवल है catdogऔर cat\ndogकेवल पर से मेल खाएगीcat
ड्रैगन

1

मुझे लगता है कि सरल समाधान हमेशा एक अच्छा समाधान होता है। मेरे मामले में, नीचे दिया गया कोड मुझे बहुत मदद करता है। मुझे उम्मीद है कि यह किसी और की मदद करता है।

#!/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

0

यदि आप अपनी फ़ाइलों को गिट में रखते हैं, तो आप अलग-अलग हाइलाइट स्क्रिप्ट के साथ संस्करणों के बीच अंतर कर सकते हैं , जो कि विभिन्न लाइनों को दिखाएगा, जिसमें हाइलाइट किए गए अंतर होंगे।

दुर्भाग्य से यह केवल तभी काम करता है जब हटाए गए लाइनों की संख्या जोड़ी गई लाइनों की संख्या से मेल खाती है - जब लाइनों का मिलान नहीं होता है तो स्टब कोड होता है, इसलिए संभवतः भविष्य में इसे ठीक किया जा सकता है।


0

पूर्ण उत्तर नहीं है, लेकिन यदि cmp -lआउटपुट पर्याप्त नहीं है, तो आप उपयोग कर सकते हैं:

sed 's/\(.\)/\1\n/g' file1 > file1.vertical
sed 's/\(.\)/\1\n/g' file2 > file2.vertical
diff file1.vertical file2.vertical

OSX पर `` sed 's / (।) / \ 1 \' $ '\ n / g' file1> file1.vertical sed 's / \ ((। \ _) / \ 1 \' $ '\ n / g का उपयोग करें। 'file2> file2.vertical `` `
mmacvicar

0

इनमें से अधिकांश जवाबों में डिफरेंट-हाइलाइट , एक पर्ल मॉड्यूल का उपयोग किया गया है। लेकिन मैं यह पता लगाना नहीं चाहता था कि पर्ल मॉड्यूल कैसे स्थापित किया जाए। इसलिए मैंने एक स्व-निहित पर्ल स्क्रिप्ट होने के लिए इसमें कुछ छोटे बदलाव किए।

आप इसका उपयोग करके स्थापित कर सकते हैं:

▶ 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

0

ccdiffकार्य के लिए एक सुविधाजनक समर्पित उपकरण है। यहाँ आपका उदाहरण इसके साथ कैसा दिखता है:

ccdiff उदाहरण आउटपुट

डिफ़ॉल्ट रूप से, यह रंग में अंतर को उजागर करता है, लेकिन इसका उपयोग बिना रंग समर्थन के भी कंसोल पर किया जा सकता है।

पैकेज डेबियन के मुख्य भंडार में शामिल है:

ccdiff एक रंगीन भिन्नता है जो परिवर्तित रेखाओं के अंदर रंग भी है।

सभी कमांड-लाइन टूल जो दो फाइलों के बीच अंतर दिखाते हैं, मामूली रूप से उपयोगी दिखने में मामूली बदलाव दिखाते हैं। ccdiff की कोशिश करता रूप देने के लिए और की लग रहा है diff --colorया colordiffहै, लेकिन बदल लाइनों के भीतर हटा दिया और addedd पात्रों के लिए रंग के रंग को नष्ट कर दिया और कहा कि लाइनों से रंग का उत्पादन के प्रदर्शन का विस्तार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.