web-dev-qa-db-ja.com

差分出力に色を付ける方法は?

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

例:

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

2つのファイルがあるとしますfile1およびfile2と私のコマンドはdiff file1 file2

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

つまり、「値が一致しない場合のdiffコマンドの出力の色を赤に変更します」

20
Aman

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

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

Ubuntu 18.04にはdiffutils 3.6があるため、それを持っています。

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

enter image description here

テスト済み:

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

どうやらコミットc0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)に追加されました。

単語レベルの差分

diff-highlightのように。可能ではないようです、機能のリクエスト: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

関連スレッド:

ydiffでもできます。以下を参照してください。

ydiff side-by-side Word level diff

https://github.com/ymattw/ydiff

これはニルヴァーナですか?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

結果:

enter image description here

行が狭すぎる場合(デフォルトは80列)、次のように画面に合わせます。

diff -u a b | ydiff -w 0 -s

テストファイルの内容:

a

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

b

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Git統合

ydiffは、構成を必要とせずにGitと統合します。

git diffの代わりにgitリポジトリ内から、次のように実行できます。

ydiff -s

git logの代わりに:

ydiff -ls

参照: https://stackoverflow.com/questions/7669963/how-can-i-get-a-side-by-side-diff-when-i-do-git-diff/14649328#14649328

Ubuntu 16.04、git 2.18.0、ydiff 1.1でテスト済み。

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カラーエスケープコード を使用して赤と緑を取得し、シェルで ANSI-Cクォート を使用して\eエスケープにアクセスします。

--old-group-format--new-group-formatは一致しない行を識別し、%<%>を使用して赤とカラーのリセットコードの間に挿入し、--unchanged-group-formatは緑とコードをリセットします。

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

20
Michael Homer

colordiff file1 file2をお試しください

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

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

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

9
modesto

色付き、単語レベルdiff ouput

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

Coloured diff screenshot

#!/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

sed強調表示について @ retracile's answer にクレジットしてください)

4
Tom Hale

Githubで利用可能なhlコマンドを確認してください:git clone http://github.com/mbornet-hl/hl以降: http://www.flashnux.com/notes/page_000022_US.html

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

diff file1 file2

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

1
mbornet

現時点でGithubにpythonで構築された本当にきちんとしたツールがあり、icdiffと呼ばれています。ニース色の出力を生成します。これも「重大度」を認識します。私は常に使用しています。チェックアウトする価値があります。

1
Joe Healey

vimがインストールされている場合は、diff file1 file2 | vim -

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

1
TrongBang

Generic Colouriser( grc )をインストールし、

grc diff file1 file2

LinuxとMacOSの両方で使用できます。

1
Sohail Si

文字レベルのカラー差分:インストール ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Output of ccdiff

0
apricot

Diffのカラーパレットを変更するには、--paletteオプションを使用します(diffバージョン3.4以降)。

diff --color=always --palette='ad=1;3;38;5;154:de=1;3;38;5;9' file1 file2

ここでaddeは、追加されたテキストと削除されたテキストの色をそれぞれ定義します。 diffオプションの詳細な説明については、man diffまたはinfo diffを参照してください。

0
sergio

注:「サイドバイサイド」出力を取得するには、「-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
Gus

このスクリプトは、標準のバージョン3.4より前のdiff(どのバージョンのdiffでも機能するはずです)を使用し、出力形式を変更せずに出力に色を付けます。 GNU diff version 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
Beam Davis

どちらでも使えます

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; }

0
himanshuxd