कमांड लाइन पर कैसे अलग करें?


502

जब मेरे पास एक अंतर है, तो मैं इसे कैसे चित्रित कर सकता हूं ताकि यह अच्छा लगे? मैं इसे कमांड लाइन के लिए चाहता हूं, इसलिए कृपया कोई GUI समाधान न करें।


6
कोई विशेष ऑपरेटिंग सिस्टम / शेल?
रोलैंड शॉ

4
Github.com/walles/riff पर प्रयास करें । एक अतिरिक्त बोनस के रूप में, यह हाइलाइट किए गए लाइनों के किन हिस्सों को उजागर करता है।
जोहान वाल्स 19

जवाबों:


607

मैन पेज diffअपने आप से रंगीकरण के लिए कोई समाधान नहीं सुझाते। कृपया उपयोग करने पर विचार करें colordiff। यह चारों ओर एक आवरण है diffजो समान उत्पादन को अलग करता है, सिवाय इसके कि यह पठनीयता बढ़ाने के लिए रंगीन सिंटैक्स हाइलाइटिंग का उपयोग करके आउटपुट को बढ़ाता है:

diff old new | colordiff

या केवल:

colordiff old new

स्थापना:

  • Ubuntu / डेबियन: sudo apt-get install colordiff
  • ओएस एक्स: brew install colordiffयाport install colordiff

45
बस पाया कि खुद :-)। इसका उपयोग करके कम में पाइप किया जा सकता है less -R, जो रंगों के लिए भागने के क्रम को सही ढंग से प्रदर्शित करता है।
डेनियल कुल्मन

34
बस सिंटैक्स का उपयोग कर सकते हैं: colordiff file1 file2
Felipe Alvarez

3
काश, यह साइड-बाय-साइड आउटपुट ( -yसक्षम करने का विकल्प) के लिए काम नहीं करता है ☹ vimdiffनीचे दिए गए सुझाव शायद एक बेहतर तरीका है
Hi-Angel

8
colordiffके लिए अच्छी तरह से काम करता है svn diff | colordiff(यानी उन स्थितियों में जहां आपके पास केवल अंतर है, न कि दो फ़ाइलों को अलग किया जा रहा है)।
कॉर्नस्टॉक

8
@ Hi-Angel की टिप्पणी के अपडेट के रूप में: colordiff को अद्यतन किया गया है और अब इसमें साइड ( -y) समर्थन शामिल है।
बेली पार्कर

333

विम का उपयोग करें :

diff /path/to/a /path/to/b | vim -R -

या फिर भी बेहतर है, VimDiff (या vim -d, जो टाइप करने के लिए छोटा है) दो-तीन या चार फाइलों के बीच अंतर को साइड-बाय-साइड दिखाएगा।

उदाहरण:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@ जिचाओ: मैं उपनामों को दूर करने के बजाय उन्हें सीखना पसंद करता हूं। इस तरह मैं उन्हें कहीं भी उपयोग कर सकता हूं, तब भी जब मेरे डॉटफ़ाइल्स उपलब्ध नहीं हैं।
जॉन्सवेब

1
@AquariusPower: ctrl-cऔर ctrl-xविम में अन्य उपयोग हैं। ctrl-qकई टर्मिनलों द्वारा कब्जा कर लिया गया है। अपनी आवश्यकताओं के अनुसार सबसे अच्छा तरीका खोजने के लिए लिखना और छोड़ना देखें ।
जॉन्सवेब

1
पहला, यह किस तरह का खोल है? zsh? मैं =(...)निर्माण को नहीं पहचानता । दूसरा, मेरे diff -ur a bमन में था।
x- यूरी

3
वास्तव में। Zsh में, प्रपत्र की=(...)
जॉन्सिवेब

1
यह समाधान स्वीकृत उत्तर से बेहतर है, क्योंकि इसके लिए आपको सिस्टम प्रशासक के अधिकार की आवश्यकता नहीं है और किसी भी अतिरिक्त उपकरण को स्थापित करना है
amanzoor

173

वास्तव में अभी तक एक और विकल्प प्रतीत होता है (जो मैंने हाल ही में देखा था, जब ऊपर वर्णित समस्या में चल रहा था):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

यदि आपके पास Git है (जो आप पहले से ही किसी भी तरह से उपयोग कर सकते हैं), तो आप इसे तुलना के लिए उपयोग कर पाएंगे, भले ही फाइलें स्वयं संस्करण नियंत्रण में न हों। यदि डिफ़ॉल्ट रूप से आपके लिए सक्षम नहीं है, तो यहां रंग समर्थन को सक्षम करना पहले से वर्णित वर्कअराउंड की तुलना में काफी आसान लगता है।


19
यह साफ है, लेकिन दुख की बात यह है कि जब इनपुट पाइप होते हैं तो यह काम नहीं करता है। उदाहरण के लिए बाइनरी फ़ाइलों की तुलना करना git diff <(xxd file1) <(xxd filed)काम नहीं करता है।
माइकल एंडरसन

8
तदनुसार, कम से कम फ़ाइलों में से एक को 'वर्तमान भंडार के बाहर' होना चाहिए git help diff। इसलिए यदि आपका अंतर अलग हो रहा है, तो कोशिश करें cdकि आप कहां हैं।
खराब अनुरोध

7
रंगों को अलग करने में सक्षम बनाने के लिए:git config color.diff auto
JWhy

2
सुपर सिंपल एंड क्विक
EE33

31
यदि दोनों फ़ाइलें वर्तमान रिपॉजिटरी के अंदर हैं, तो git diff --no-indexदो फ़ाइलों की तुलना करने के लिए उपयोग करें।
ओलिवियर 'एल्बूम' शॉलर

94

diff --color विकल्प को जीएनयू डिफुटिल्स 3.4 (2016-08-08) में जोड़ा गया था

diffअधिकांश डिस्ट्रोस पर यह डिफ़ॉल्ट कार्यान्वयन है, जो जल्द ही मिल जाएगा।

Ubuntu 18.04 में diffutils3.6 है और इसलिए यह है।

3.5 पर यह इस तरह दिखता है:

यहाँ छवि विवरण दर्ज करें

परीक्षण:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

जाहिरा तौर पर प्रतिबद्ध c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (मार्च 2015) में जोड़ा गया।

शब्द-स्तर में अंतर

की तरह diff-highlight। यह संभव नहीं लगता है, फ़ीचर अनुरोध: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

संबंधित सूत्र:

ydiff हालांकि, यह नीचे देखें।

ydiff अगल-बगल शब्द स्तर भिन्न होता है

https://github.com/ymattw/ydiff

क्या यह निर्वाण है?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

परिणाम:

यहाँ छवि विवरण दर्ज करें

यदि लाइनें बहुत संकरी हैं (डिफ़ॉल्ट 80 कॉलम), तो इसके साथ स्क्रीन पर फिट करें:

diff -u a b | ydiff -w 0 -s

परीक्षण फ़ाइलों की सामग्री:

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff एकीकरण

ydiff आवश्यक कॉन्फ़िगरेशन के बिना गिट के साथ एकीकृत करता है।

अंदर के बजाय git diff, आप केवल कर सकते हैं:

ydiff -s

और इसके बजाय git log:

ydiff -ls

यह भी देखें: जब मैं "git diff" करता हूं, तो मैं साइड-बाय-साइड अंतर कैसे प्राप्त कर सकता हूं?

उबंटू 16.04, git 2.18.0, ydiff 1.1 पर परीक्षण किया गया।


यहाँ प्रलेखन है।
एलेक्सी

1
उस मेलिंग लिस्ट थ्रेड में: There is no word-highlighting, yet- कोई अपडेट? यह वही है जो मैं इस सवाल के लिए आया था (मैं चाहता हूं grep --color-जैसे अलग आउटपुट)।
०३६__

@ i336_ दुर्भाग्य से कोई अपडेट नहीं, अगर मुझे कोई मिलता है, तो मैं सवाल को अपडेट करूंगा। अगर आपको कुछ मिले तो मुझे पिंग करें।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

वैसे git diff --colorकाम भी करता है। Ssh पर काम करते समय उपयोगी।
नागदेव

बहुत बड़ा है? उपयोगdiff --color=always | less -R
inetphantom

69

और उन अवसरों के लिए जब आपके तत्काल नियंत्रण से परे कुछ पागल बाधा के कारण एक yum install colordiffया एक apt-get install colordiffविकल्प नहीं है, या आप सिर्फ पागल महसूस कर रहे हैं , तो आप पहिया को एक पंक्ति के साथ फिर से आविष्कार कर सकते हैं:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

एक शेल स्क्रिप्ट में फेंक दें और एकीकृत पाइप इसके माध्यम से आउटपुट को अलग करते हैं।

यह हंक मार्करों को नीला बनाता है और क्रमशः हरे और लाल पृष्ठभूमि में नए / पुराने फ़ाइलनाम और जोड़े / हटाए गए लाइनों को हाइलाइट करता है। 1 और यह अंतरिक्ष में 2 बदलाव करेगा, जो कॉर्डियोर्ड कैन की तुलना में अधिक आसानी से स्पष्ट होगा।


1 संयोग से, फ़ाइल नाम को संशोधित लाइनों के रूप में ही उजागर करने का कारण यह है कि फ़ाइल नाम और संशोधित लाइनों के बीच सही अंतर करने के लिए आवश्यक रूप से फ़ॉरेस्ट प्रारूप को पार्स करना आवश्यक है, जो कि रेगेक्स से निपटने के लिए कुछ नहीं है। उन्हें समान रूप से काम करना "अच्छी तरह से पर्याप्त" नेत्रहीन और समस्या को तुच्छ बनाता है। उस ने कहा, कुछ दिलचस्प सूक्ष्मताएं हैं

2 लेकिन पीछे चल रहे टैब नहीं। जाहिरा तौर पर टैब उनकी पृष्ठभूमि सेट नहीं मिलता है, कम से कम मेरे xterm में। यह टैब बनाम स्थान परिवर्तन करता है हालांकि थोड़ा बाहर खड़ा है।


5
@ मैट: यहाँ एक मैक के लिए एक जानवर-बल दृष्टिकोण है: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(हालांकि मुझे उम्मीद है कि एक बेहतर तरीका है)।
रेट्रासील

1
हम्म, यह काम किया ... प्रत्येक ठग के बीच एक गुलाबी पृष्ठभूमि में 3 डैश दिए।
मैट मोंटाग

आसानी से उदाहरण के लिए रंगों को बदलने के लिए एक विकल्प के बिना मैनुअल अपठनीय, अप्राप्य तरीका।

1
यार ये कमाल है! जाने के लिए रास्ता! यह कुछ अच्छा sed जादूगर है।
fthinker

6
sed 's / ^ - / \ X1b [31m - /; s / ^ + / \ X1b [32m + /; s / ^ @ / \ X1b [34m @ / s] / $ / \ X1b [0m /] भी बहुत अच्छा लगता है
युरा

16

आप colordiff का उपयोग करने के लिए तोड़फोड़ विन्यास बदल सकते हैं

~ / .Subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

के माध्यम से: https://gist.github.com/westonruter/846524


svn: प्रक्रिया शुरू नहीं कर सकते 'colordiff': संसाधन अस्थायी रूप से अनुपलब्ध
niken

क्या आपने कोलोर्डिफ़ स्थापित किया?
Azd325

हाँ, मैं (साथ ही cygwin में चल रहा है)
हार्डकॉकिंग

idk कोशिश कर सकते हैं इस superuser.com/questions/635995/...
Azd325

12

रंगीन, शब्द-स्तर 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 में इस आउटपुट का उपयोग कैसे करूँ?
हेमंत शर्मा

के लिए vim, एक प्लगइन का उपयोग करें, उदाहरण के लिए diffchar
टॉम हेल

10

मैं grc(जेनेरिक Colouriser) का उपयोग करता हूं , जो आपको कई आदेशों के आउटपुट को रंगीन करने की अनुमति देता है diff

यह एक पायथन लिपि है जिसे किसी भी कमांड के चारों ओर लपेटा जा सकता है। इसलिए diff file1 file2आह्वान grc diff file1 file2करने के बजाय , आप कोली आउटपुट देखने के लिए आमंत्रित करेंगे । मैंने इसे आसान बनाने के diffलिए उपनाम grc diffदिया है।


fork()कॉल के कारण mingw / cygwin के साथ विंडोज पर काम नहीं करता है , हालांकि WSL के साथ काम करने की संभावना है।
गेब्रियल डेविलर्स

6

यहाँ एक और समाधान है कि आह्वान है sedरंग दिखाने के लिए के लिए उपयुक्त एएनएसआई भागने दृश्यों सम्मिलित करने के लिए +, -और @, लाल, हरे, और सियान में लाइनों क्रमशः।

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

इस प्रश्न के अन्य समाधानों के विपरीत, यह समाधान ANSI एस्केप अनुक्रमों को स्पष्ट रूप से नहीं बताता है। इसके बजाय, यह क्रमशः उचित रंग सेट करने और टर्मिनल विशेषताओं को रीसेट करने के लिए एएनएसआई से बचने के क्रम उत्पन्न करने के लिए आदेश tput setafऔर tput sgr0आदेश देता है।

प्रत्येक तर्क के लिए उपलब्ध रंगों को देखने के लिए tput setaf, इस कमांड का उपयोग करें:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

यहाँ आउटपुट कैसे दिखता है:

यहाँ छवि विवरण दर्ज करें

यहाँ सबूत है कि tput setafऔर tput sgr0कमांड उपयुक्त ANSI एस्केप सीक्वेंस उत्पन्न करते हैं:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m

5

चूंकि wdiffसम्मिलन और विलोपन दोनों की शुरुआत और अंत में स्ट्रिंग निर्दिष्ट करने के लिए स्वीकार करता है, आप एएनएसआई रंग अनुक्रमों को उन तारों के रूप में उपयोग कर सकते हैं:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

उदाहरण के लिए, यह दो CSV फ़ाइलों की तुलना का आउटपुट है:

CSV फ़ाइलों के आउटपुट को अलग करें

Https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html से उदाहरण


1
colordiffअब (1.0.16) समझता है wdiff, इसलिए आप बस पाइप भी कर सकते हैं wdiff -n f1 f2 | colordiff:। wdiffडिफ्यूटल में विलीन हो जाना चाहिए ...
Ciro Santilli 冠状 diff diff ged at at

3

मैं आपको सुझाव देना चाहूंगा कि आप अलग -अलग कल्पना करें। मैं इसे अपने काम के दौरान उपयोग करता हूं और यह सुनिश्चित करता है कि यह अब तक बहुत अच्छा है। यह कई विकल्पों के साथ पैक किया गया है और यह आपके तरीके को कॉन्फ़िगर करने के लिए वास्तव में आसान है जिस तरह से आप चाहते हैं।

आप इसे इसके द्वारा स्थापित कर सकते हैं:

sudo npm install -g diff-so-fancy

या मैक पर:

brew install diff-so-fancy

बाद में, आप इस तरह से अपने अंतर को उजागर कर सकते हैं:

diff -u file1 file2 | diff-so-fancy


0

उबंटू पर गिट के हाल के संस्करणों पर, आप इसके साथ अलग-हाइलाइटिंग सक्षम कर सकते हैं:

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

और फिर इसे अपने में जोड़ना .gitconfig:

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

यह संभव है कि स्क्रिप्ट अन्य डिस्ट्रोस में कहीं और स्थित है, आप यह locate diff-highlightपता लगाने के लिए उपयोग कर सकते हैं कि कहां है।


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