web-dev-qa-db-ja.com

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

色付きの出力を生成するgit diffを使用しています。ただし、何かに通常のdiffを使用する必要があることがわかりました。色が不足しているため、出力が大量に出力され、読みにくくなっています。 diffで読みやすい色付きの出力を作成するにはどうすればよいですか?大きなファイルを簡単に確認できるように、パイプを少なくするのが理想的です。

38
Benubird

diffは色を出力できません。そのためにはcolordiffなどの別のプログラムが必要です。端末の色は ANSIエスケープコード を介して出力されますが、lessはデフォルトでは解釈しません。 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"}'
33
terdon

ここでの他の回答は古くなっている可能性があります。 coreutils 3.5以降では、diffは実際に色付きの出力を生成できます。これは、stdoutがコンソールでない場合、デフォルトでオフになっています。

Manページから:

--color[=WHEN]
出力に色を付けます。 WHENは、neveralways、またはauto(デフォルト)にすることができます

Stdoutがパイプの場合にカラー出力を強制するにはdiff --color=always -- "$file1" "$file2" | less -Rは動作するはずです。

13
Kshitiz Sharma

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

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へのパイプは、closesを閉じたときに出力が失われるためです。

代替の(そして、私が思うに、より良い)方法は、-Xを使用して画面のクリアが少なくならないようにすることです。

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

これは私にとってはうまく機能しますが、bashに固有の場合があります。 colordiffは組み込みではありませんが、簡単にインストールできます。

9
Benubird