कैसे रंग अलग उत्पादन करने के लिए?


18

मैं सशर्त रूप से यूनिक्स फ़ाइलों को प्रारूपित करना चाहता था, मैं वर्तमान में diffकमांड पर काम कर रहा हूं और जानना चाहता हूं कि क्या diffकमांड आउटपुट के पाठ को प्रारूपित करना संभव है ।

उदाहरण:

मिलान किए गए मान हरे रंग में प्रदर्शित होने चाहिए।
बेजोड़ मूल्यों को लाल रंग में प्रदर्शित किया जाना चाहिए।

मान लीजिए मैं दो फ़ाइलें file1और file2और मेरे आदेश है diff file1 file2

अब मैं चाहता था कि मान लें कि उत्पादन में 5 बेमेल हैं तो उन बेमेल को लाल रंग में प्रदर्शित किया जाना चाहिए। यूनिक्स का उपयोग करके इसे कैसे प्राप्त करें?

संक्षेप में "बेमेल रंग को लाल रंग के लिए अलग मान के आउटपुट के लिए बदलें जो बेमेल हो"


2
के संभावित डुप्लिकेट इस
FloHimself

"मैच" और "मिसमैच" शब्द थोड़ा भ्रमित करने वाले हैं। वैसे भी, अभी 3.4 में और बाद में --color विकल्प है।
गेरी लुफ्वांस

जवाबों:


24

diff --color विकल्प जोड़ा गया था GNU diffutils 3.4 (2016-08-08)

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

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

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

साथ में:

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

मैंने यह भी अनुरोध किया है कि शब्द स्तर इस प्रकार से भिन्न है diff-highlight: [डिफुटिल्स-डेवेल] एक झंडे को रंगीन आउटपुट के रूप में जोड़ने के लिए जैसे कि गिट डिफ-एच | lists.gnu.org

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


1
अति उत्कृष्ट! डिफ़ॉल्ट रूप से इसे सक्षम करने के लिए: alias diff='diff --color=auto'
टॉम हेल

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

19

यदि आपके पास जीएनयू तक पहुंच है, तो diffआप बिना किसी अतिरिक्त उपकरण के उस प्रभाव को प्राप्त करने के लिए इसके --X-group-formatविकल्पों का उपयोग कर सकते हैं :

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

एएनएसआई-रंग एस्केप कोड का उपयोग लाल और हरे रंग को पाने के लिए करता है , एएनएसआई-सी को एस्केप तक पहुंचने के लिए शेल में उद्धृत किया \eजाता है।

--old-group-formatऔर --new-group-formatगैर-मिलान लाइनों की पहचान करें %<और हरे और रीसेट कोड के बीच मिलान लाइनों %>को --unchanged-group-formatसम्मिलित करते हुए, लाल और रंग रीसेट कोड का उपयोग करके उन्हें डालें ।

आप प्रत्येक लाइन पर निरर्थक रंग से बचने की कीमत पर (आदि) भी उपयोग--old-line-format कर सकते हैं --old-line-format=$'\e[0;31m%L\e[0m':।


जब मैं इसे चलाता हूं तो यह अंतर देता है: 0653-821 अवैध विकल्प - - diff: 0653-821 अवैध विकल्प - o diff: 0653-821 अवैध विकल्प - d diff: 0653-821 अवैध विकल्प - - diff: 0653-821 अवैध विकल्प - g diff: 0653-821 अवैध विकल्प - o त्रुटियों की तरह।
अमन

हॉर्मर जब मैं एक समय में एक पंक्ति के रूप में आपकी कमांड चला रहा हूं तो यह नई लाइन नहीं दे रहा है आउटपुट -बश-4.2 -new-group-format = $ '\ e [0; 31m%> \ e [0m' \ _ >
अमन

क्या मैं इसे डिफ़ॉल्ट रूप से कॉन्फ़िगर कर सकता हूं?
यूजेन कोनकोव

@EugenKonkov आप अपने शेल में एक उर्फ ​​या फंक्शन सेट कर सकते हैं diff
माइकल होमर

इससे मुझे काम करने में थोड़ी परेशानी हुई। अपरिवर्तित सामान को जोड़ा गया दिखा रहा था ... कोलोर्डिफ़ को छोड़ दिया और स्थापित किया
ब्रायन पीटरसन

9

प्रयत्न colordiff file1 file2

अपने लिनक्स / बीएसडी वितरण के साथ कोऑर्डिफ़ की उपलब्धता

डेबियन या उबंटू (या उनके किसी भी डेरिवेटिव) को चलाने वाले शायद डाउनलोड और इंस्टॉल करने के लिए "एप्ट-गेट इंस्टॉल कोलोर्डिफ" का उपयोग कर सकते हैं; कोऑर्डिफ़ को कई अन्य लिनक्स, यूनिक्स और बीएसडी वितरण और ऑपरेटिंग सिस्टम के लिए भी पैक किया गया है।

( Http://www.colordiff.org/ से उद्धरण )


1
उत्तम। मेरे लिए, diff --color=autoकेवल लाइन मार्कर्स और प्रत्येक +/ -सेक्शन की पहली लाइन को कोलाइजिंग था । less -SRआसान ब्राउज़िंग के लिए पाइपिंग करना।
वाल्फ

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


1

आपके पास hlgithub पर उपलब्ध कमांड पर एक नज़र होनी चाहिए : git clone http://github.com/mbornet-hl/hl और http://www.flashnux.com/notes/page_0000___.html

hlएक लिनक्स कमांड है जो C में लिखा गया है, विशेष रूप से एक टेक्स्ट फाइल या कमांड के आउटपुट को रंगीन करने के लिए डिज़ाइन किया गया है। आप एक साथ 42 रंगों का उपयोग कर सकते हैं , और कमांड लाइनों को सरल बनाने के लिए एक कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं । आप हर उस कमांड के आउटपुट को कलर कर सकते हैं, जिसे दूसरे पर लगाया जा सकता है। और यदि आप जानते हैं कि नियमित अभिव्यक्ति क्या है, तो आपके लिए इसका उपयोग करना बहुत आसान होगा। आप इसका उपयोग manकैसे करें, यह समझने के लिए आप पृष्ठ का उपयोग कर सकते हैं ।
hlका उपयोग करना और कॉन्फ़िगर करना बहुत आसान है। तुम भी hl_generic स्क्रिप्ट का उपयोग उनके वाक्यविन्यास को संशोधित किए बिना कमांड आउटपुट को रंग देने के लिए कर सकते हैं ।
उदाहरण के लिए, आप diffअपनी सामान्य कमांड को टाइप करके कमांड के आउटपुट को रंगीन कर सकते हैं :

diff file1 file2

यदि आपको कुछ सहायता की आवश्यकता है, तो बस मुझे एक ई-मेल भेजें।
सादर।


1

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


1

यदि आपके पास विम है, तो आप कर सकते हैं diff file1 file2 | vim -

विम अलग प्रारूप को पहचानेंगे और इसे उचित रंग देंगे। अंत में डैश को अलग कमांड से इनपुट स्वीकार करने देना है।


'दृश्य' (पढ़ने के लिए केवल शॉर्टकट) इस उद्देश्य के लिए बेहतर अनुकूल है।
अनुपम श्रीवास्तव

1

जेनेरिक Colouriser ( grc ) स्थापित करें और:

grc diff file1 file2

लिनक्स और मैकओएस दोनों पर उपलब्ध है।


0

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

1।diff --color=auto file1 file2

2।colordiff file1 file2

3. मेरा पसंदीदा: git diff file1 file2नीचे के रूप में लागू:

मैं वर्तमान में उपयोग कर रहा हूं और सिफारिश कर रहा हूं कि या तो इसके आउटपुट का उपयोग करके git diff या इसके साथ पाइपिंग कर रहा हूंcolordiff :

diff() { git diff --no-index "$1" "$2" | colordiff; }


मुझे git diff --no-indexभी पसंद है लेकिन मुझे लगता है कि फाइलों को तलाशने की जरूरत है। (कम से कम, मेरे लिए बैश प्रक्रिया प्रतिस्थापन के साथ काम नहीं करता है)
कार्ल

@ कर्ल फिगर जो अपने आप को बाहर निकालता है, शायद एक टर्मिनल सेटिंग है जो इसे (या) किसी अन्य तरीके से खोज करने योग्य बनाती है। मैं git diffलंबे समय से उपयोग कर रहा हूं और फ़ाइल मेरे लिए उपयोगी है, अन्यथा मेरे द्वारा इसे सही करने का कोई उपयोग नहीं होगा।
ह्वेनशॉक्स

2
शायद मैं बहुत स्पष्ट नहीं था। (मूर्खतापूर्ण) उदाहरण के रूप में, यह मेरे लिए काम करता है diff --color <(ls | head -n+3) <(ls | tail -n +5)लेकिन साथ नहीं git diff। बेशक, एक आम मामला नहीं है या बहुत मुश्किल काम नहीं है।
कार्ल

0

बस एक नोट: "साइड-बाय-साइड" आउटपुट प्राप्त करने के लिए आपको "--color = always" चाहिए। आप इसे कम और रंगीन आउटपुट को बनाए रखने के लिए पृष्ठांकित भी कर सकते हैं:

diff -y --color=always file1 file2 | less -R

और फिर भी एक और संकेत: अंत में "--color = हमेशा" स्विच रखने का प्रयास करें। कारण? 2.27.1 उपयोग-लिनेक्स से dmesg के साथ:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

यह स्क्रिप्ट मानक पूर्व-संस्करण 3.4 अंतर का उपयोग करता है (इसे किसी भी संस्करण के साथ काम करना चाहिए) और आउटपुट स्वरूप को किसी भी तरह से बदले बिना आउटपुट को रंगीन करता है। यह आरएचईएल (संस्करण 7.5) के नवीनतम संस्करण के साथ काम करता है जिसमें जीएनयू भिन्न संस्करण 3.3 है। बस इसे अपने ~ / बिन निर्देशिका में या कहीं और अपने पथ में डाल दें (मैं इसे "cdiff" कहने का सुझाव देता हूं)।

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

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