मैं रंगीन पाइप को कम उत्पादन में कैसे अलग करूं?


37

मैं git diff का उपयोग कर रहा हूं, जो रंगीन आउटपुट का उत्पादन करता है। हालाँकि, मुझे लगता है कि मुझे किसी चीज़ के लिए साधारण अंतर का उपयोग करने की आवश्यकता है, और यह बहुत अधिक उत्पादन कर रहा है जो कि रंगों की कमी के कारण पढ़ना मुश्किल है। मैं एक पठनीय, रंगीन आउटपुट कैसे बना सकता हूं? बड़ी फ़ाइलों की आसान समीक्षा के लिए आदर्श रूप से इसे कम करने के लिए पाइपिंग करते समय।

जवाबों:


32

diffरंगों का उत्पादन नहीं किया जा सकता है, आपको इसके लिए एक और कार्यक्रम की आवश्यकता colordiffहै। टर्मिनल में रंग ANSI एस्केप कोड के माध्यम से प्रिंट किए जाते हैं जो डिफ़ॉल्ट रूप से व्याख्या नहीं करता है। प्राप्त करने के लिए lessसही ढंग से रंग को दिखाने के लिए, आप की जरूरत -rहै या और भी बेहतर, -Rस्विच:

colordiff -- "$file1" "$file2" | less -R

से man less:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

वैकल्पिक रूप से, आप उपयोग कर सकते हैं moreजो डिफ़ॉल्ट रूप से रंगों को सही ढंग से प्रदर्शित करेगा।


यदि आप बाहरी प्रोग्राम स्थापित नहीं कर सकते हैं, तो आपको अधिक मैन्युअल दृष्टिकोण का उपयोग करके समान आउटपुट प्राप्त करने में सक्षम होना चाहिए:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'

1
और अगर कोई प्रदर्शित डेटा का प्रतिशत देखना चाहता है, तो उन्हें उपयोग करना होगा less -RM +Gg: superuser.com/questions/64972/…
baptx

13

यहाँ अन्य उत्तर पुराने हो सकते हैं। Coreutils 3.5 के रूप में diffवास्तव में रंगीन आउटपुट उत्पन्न कर सकता है जो डिफ़ॉल्ट रूप से बंद हो जाता है जब स्टडआउट कंसोल नहीं होता है।

मैन पेज से:

--color[=WHEN]
आउटपुट को रंगीन करें; WHENहो सकता है never, alwaysया, auto(डिफ़ॉल्ट)

जब एक पाइप diff --color=always -- "$file1" "$file2" | less -Rकाम करना चाहिए तो स्टडआउट रंग उत्पादन को मजबूर करने के लिए ।


आप alias diff='diff --color=always'एक .bashrcया .zshrcफ़ाइल में भी शामिल कर सकते हैं ।
jftuga

1
हाँ। मैं उपयोग कर रहा हूँalias diff='diff --side-by-side --left-column --color=always'
क्षितिज शर्मा

मैं उपयोग करता हूं alias diff='/usr/bin/diff --color=always 'और alias less='/usr/bin/less -r 'हालांकि यह अंतर शुरू में कम के पहले कुछ पन्नों पर रंगीन होता है, लेकिन लंबे समय तक यह कभी-कभी मोनो में वापस आ जाता है। यह कूदता पर हो सकता है जो स्पष्ट रूप से अंतर को प्रभावित नहीं करेगा, क्योंकि यह आउटपुट केवल एक बार उत्पन्न होता है और कूदने की आवश्यकता नहीं होती है, लेकिन किसी तरह कम रंगों का ट्रैक खो देता है।
नीलजी

8

पाइप रंग को कम करने के लिए अलग:

diff $file1 $file2 | colordiff | less -r

इसे एक स्क्रीन पर सीमित करके इसे और अधिक पठनीय बनाने के लिए:

diff -uw $file1 $file2 | colordiff | less -r

और, कम प्रदर्शित करने के लिए यदि केवल एक स्क्रीन सामग्री के लायक न हो तो:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

-F सामग्री के एक से कम स्क्रीन वर्थ से कम होने पर तुरंत बंद करने का कारण बनता है, पाइप से stderr को क्योंकि जब कम बंद आप आउटपुट खो देते हैं - तो stderr को पाइप करके, यह कम डिस्प्ले नहीं होने पर भी आउटपुट मिलता है।

एक विकल्प (और, मुझे लगता है, बेहतर), स्क्रीन को कम करने से रोकने के लिए सिर्फ -X का उपयोग करना है:

diff -uw $file1 $file2 | colordiff | less -r -X -F

यह मेरे लिए अच्छी तरह से काम करता है, लेकिन हो सकता है कि यह बैश हो जाए। कोऑर्डिफ़ एक अंतर्निहित नहीं है, लेकिन आसानी से स्थापित है।


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