diff出力を色付けする方法は?


18

Unixファイルを条件付きでフォーマットしたかったのですが、現在diffコマンドに取り組んでおり、diffコマンド出力のテキストをフォーマットできるかどうかを知りたいと思いました。

例:

一致した値は緑色で表示されます。
一致しない値は赤で表示されます。

私は2つのファイルを持っていると仮定file1してfile2、私のコマンドがありますdiff file1 file2

ここで、出力に5つの不一致が含まれていると仮定して、それらの不一致を赤色で表示する必要があります。UNIXを使用してこれを達成する方法は?

要するに、「不一致の値に対するdiffコマンドの出力の色を赤に変更する」


2
可能性のある重複したこの
FloHimself

「マッチ」と「ミズマッハ」という用語は少しわかりにくいです。とにかく、現在diff 3.4以降に--colorオプションがあります。
ジェリールフワンサ

回答:


23

diff --color オプションが追加されましたGNU diffutils 3.4(2016-08-08)

これはdiffほとんどのディストリビューションでのデフォルトの実装であり、まもなく実装される予定です。

3.5では、次のようになります。

ここに画像の説明を入力してください

で:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

また、次のように単語レベルの差分を要求しdiff-highlightました。[Diffutils-devel] git diff-h | lists.gnu.org

コミットc0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)に追加されたようです。


1
優秀な!デフォルトでこれを有効にするには: alias diff='diff --color=auto'
トム・ヘイル

1
これがドキュメントです。
アレクセイ

19

GNUにアクセスdiffできる場合は、追加のツールなしで--X-group-formatオプションを使用してその効果を得ることができます。

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

ANSI-C エスケープコードを使用して赤と緑を取得し、シェルにANSI-Cを引用して\eエスケープにアクセスします。

--old-group-formatそして、--new-group-format一致しない行を識別し、使用して赤と色リセットコードの間にそれらを挿入する%<%>しながら、--unchanged-group-formatインサートは緑色とリセットコード間の線と一致します。

また--old-line-format(など)を使用することもできますが、すべての行で冗長なカラーエスケープが使用されます--old-line-format=$'\e[0;31m%L\e[0m'


実行すると、diff:0653-821違法オプション--diff:0653-821違法オプション-o diff:0653-821違法オプション-d diff:0653-821違法オプション--diff:0653-821違法オプション-g diff:0653-821違法オプション-oエラーのようなもの。
アマン

一度に1行ずつコマンドを実行しているときにHormerが改行を出力しない-bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
アマン

デフォルトで設定できますか?
オイゲンコンコフ

@EugenKonkovシェルでエイリアスまたは関数を設定して、それを実行できますdiff
マイケル・ホーマー

これにより、動作させるのに少し苦労しました。変更されていないものが追加されたように表示されていた... colordiffをあきらめてインストールした
ブライアンピーターソン

9

試してみる colordiff file1 file2

Linux / BSDディストリビューションでのcolordiffの可用性

DebianまたはUbuntu(またはそれらの派生物)を実行している人は、おそらく「apt-get install colordiff」を使用してダウンロードしてインストールすることができます。colordiffは、他の多くのLinux、UNIX、およびBSDディストリビューションとオペレーティングシステム用にもパッケージ化されています。

http://www.colordiff.org/からの引用)


1
パーフェクト。私にとっては、diff --color=autoラインマーカーと各+/ -セクションの最初の行だけを着色していました。に配管するless -SRと、簡単にブラウジングできます。
ウォルフ

4

着色、単語レベルの diff出力に含ま

以下のスクリプトとdiff-highlightでできることは次のとおりです。

色付きのdiffスクリーンショット

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(強調表示に対する@retracileの回答に対するクレジットsed


1

あなたは見ている必要がありhlgithubの上で利用可能なコマンドを:git clone http://github.com/mbornet-hl/hl と上:http://www.flashnux.com/notes/page_000022_US.html

hlCで書かれたLinuxコマンドで、特にテキストファイルまたはコマンドの出力に色を付けるように設計されています。最大42色を同時に使用でき、構成ファイルを使用してコマンドラインを簡素化できます。別のコマンドにパイプできるすべてのコマンドの出力を色付けできます。そして、正規表現が何であるかを知っていれば、非常に簡単に使用できます。このmanページを使用して、使用方法を理解できます。
hl使用と設定が非常に簡単です。hl_genericスクリプトを使用して、構文を変更せずにコマンド出力を色付けすることもできます。
たとえば、diff通常のコマンドを入力するだけで、コマンドの出力を色付けできます。

diff file1 file2

助けが必要な場合は、私にメールを送ってください。
よろしく。


1

現時点でGithubにはpythonで構築された本当にすてきなツールがありicdiffます。「重大度」にも対応した素敵な色の出力を生成します。私はいつもそれを使っているので、チェックする価値があります。


0

どちらでも使用できます

1。diff --color=auto file1 file2

2。colordiff file1 file2

3.私のお気に入り:git diff file1 file2以下のように実装されています:

私は現在使用していますが、を使用するgit diff 、その出力をcolordiff使用してパイプすることをお勧めします:

diff() { git diff --no-index "$1" "$2" | colordiff; }


私も好きgit diff --no-indexですが、ファイルはシーク可能である必要があると思います。(少なくとも、bashプロセスの置換では機能しません)
カール

自分とは別の@Karl図、それを行う(または)他の方法でシーク可能にするターミナル設定があるかもしれません。私はgit diff長い間使用しており、ファイルは私にとってシーク可能です。
himanshuxd

2
おそらく、私はあまり明確ではありませんでした。(愚かな)例として、これは私には機能しますdiff --color <(ls | head -n+3) <(ls | tail -n +5)が、では機能しませんgit diff。確かに、一般的なケースではなく、回避するのも難しい。
カール

0

注:「サイドバイサイド」出力を取得するには、「-color = always」が必要です。少ないページ数でページ分割し、色付きの出力を保持することもできます。

diff -y --color=always file1 file2 | less -R

さらに別のヒント:最後に "--color = always"スイッチを維持するようにしてください。理由?util-linux 2.27.1のdmesgを使用:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

このスクリプトは、バージョン3.4以前の標準のdiff(どのバージョンのdiffでも動作するはずです)を使用し、出力形式を一切変更せずに出力を色付けします。GNU diffバージョン3.3を備えたRHELの最新バージョン(バージョン7.5)で動作します。〜/ binディレクトリまたはパスの他の場所に置くだけです(「cdiff」と呼ぶことをお勧めします)。

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

0

vimがインストールされている場合は、次のことができます diff file1 file2 | vim -

Vimはdiff形式を認識し、適切な色を付けます。最後のダッシュは、vimがdiffコマンドからの入力を受け入れるようにすることです。


'view'(vimへの読み取り専用ショートカット)は、この目的により適しています。
アヌパムスリバスタ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.