Как мне передать цветной разностный вывод на меньшее?


37

Я использовал git diff, который выдает цветной вывод. Тем не менее, теперь я обнаружил, что мне нужно для чего-то использовать обычный 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действительно может выводить цветной вывод, который по умолчанию отключен, когда стандартный вывод не является консолью.

Со страницы руководства:

--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 'хотя хотя различие первоначально окрашено на первых нескольких страницах меньшего количества, но на длинных различий это иногда возвращается к моно. Это может быть при переходах, которые явно не будут влиять на diff, так как его выходные данные генерируются только один раз и не должны переходить, но как-то меньше теряют след цветов.
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.