カラーdiff出力をより少ない出力に転送するには?

カラーdiff出力をより少ない出力に転送するには?

私はgit diffを使っていて、カラー出力を生成します。しかし、特定のタスクを実行するには、通常のdiffを使用する必要があり、色の不足によって読みにくい出力がたくさん生成されることがわかりました。 diffに読みやすいカラー出力を生成させるにはどうすればよいですか?理想的には、大容量ファイルを見やすくするために、同時に少ない量で転送することをお勧めします。

答え1

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"}'

答え2

ここの他の答えは古いかもしれません。 coreutils 3.5以降、diffカラー出力を生成することは実際に可能であり、標準出力がコンソールでない場合はデフォルトでオフになります。

マニュアルページから:

--color[=WHEN]
出力を色分けします。 、または (デフォルト) のいずれかWHENです。neveralwaysauto

強制カラー出力は、標準出力がパイプの場合にdiff --color=always -- "$file1" "$file2" | less -R機能する必要があります。

答え3

色の違いを少なくパイプします。

diff $file1 $file2 | colordiff | less -r

読みやすくするには、単一の画面に制限してください。

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

そして、コンテンツ画面が1つしかない場合、少ないコンテンツは表示されません。

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

1画面分のコンテンツより少ない場合、-Fはlessが即座に終了し、lessが終了すると出力が失われるため、stderrにパイピングします。 stderrにパイピングすると、lessが表示されなくても出力が得られます。

別の(私の考えではより良い)方法は、-Xを使用して画面があまり頻繁に消去されるのを防ぐことです。

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

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

答え4

私は使用します即興演奏:

diff "$A" "$B" | riff

または、diff後から暗黙的に呼び出される内容は次のとおりです。

riff "$A" "$B"

Riffは、どの行が変更されたかを知らせるだけでなく、行のどの部分が変更されましたか?(下記のスクリーンショットを参照)。

Riffは基本的に同じ方法で出力をページ付けするので、gitポケットベルの統合について心配する必要はありません。

何よりもRiffが統合されているgitので、友達からもこの結果を得ることができますgit diff

ここで入手:https://github.com/walles/riff/releases/

即興演奏

免責事項:私がriff直接書いたので、当然お勧めします:)。

関連情報