Як я можу подати кольоровий різний вихід на менше?


37

Я використовував git diff, який дає кольоровий вихід. Однак зараз я вважаю, що мені потрібно використовувати звичайний 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дійсно, можна отримати кольоровий вихід, який за замовчуванням вимкнено, коли stdout не є консоллю.

На чоловіковій сторінці:

--color[=WHEN]
розфарбувати вихід; WHENможе бути never, alwaysабо auto(за замовчуванням)

Щоб примусити кольоровий вихід, коли stdout є трубою, 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'
Kshitiz Sharma

Я використовую alias diff='/usr/bin/diff --color=always 'і , alias less='/usr/bin/less -r 'але хоча різниця спочатку пофарбована на перших декількох сторінках менше , але на довгих порівнянні воно іноді перевертається назад в моно. Це може бути на стрибках, що явно не вплине на розбіжність, оскільки його вихід генерується лише один раз і не повинен стрибати, але якось менше втрачає сліди кольорів.
NeilG

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

Це добре працює для мене, але може бути специфічним для bash. colordiff не є вбудованим, але легко встановлюється.


2
Єдина команда, яка йому потрібна,less -r
sendmoreinfo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.