色付きのdiff出力をlessにパイプするにはどうすればよいですか?


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 +Ggsuperuser.com/questions/64972/...
baptx

13

ここでの他の答えは時代遅れかもしれません。coreutils 3.5以降diffでは、stdoutがコンソールでない場合、デフォルトでオフになっている色付きの出力を実際に生成できます。

manページから:

--color[=WHEN]
出力を色付けします。WHENすることができneveralwaysまたは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シャルマ

私は使用alias diff='/usr/bin/diff --color=always 'alias less='/usr/bin/less -r 'ますが、diffは最初はlessの最初の数ページで色付けされますが、長いdiffでは時々モノに戻ります。これは、出力に一度だけ生成され、ジャンプする必要がないため、diffに明らかに影響しないジャンプである可能性がありますが、何らかの形で色の追跡が失われます。
NeilG

8

色付きのdiffを以下にパイプするには:

diff $file1 $file2 | colordiff | less -r

1つの画面に制限することで読みやすくするには:

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

また、コンテンツが1画面しかない場合に表示しないようにするには:

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

-Fは、コンテンツが1画面未満の場合、lessをすぐに閉じます。stderrへのパイプは、lessを閉じると出力を失うためです。stderrへのパイピングにより、lessが表示されなくても出力を取得します。

別の(そして、私が思うに、より良い)方法は、単に-Xを使用して、画面があまりクリアされないようにすることです。

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

これは私にはうまくいきますが、bashに固有のものかもしれません。colordiffは組み込みではありませんが、簡単にインストールできます。


2
彼が必要とする唯一のコマンドはless -r
-sendmoreinfo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.