Unixファイルを条件付きでフォーマットしたかったのですが、現在diff
コマンドに取り組んでおり、diff
コマンド出力のテキストをフォーマットできるかどうか知りたいと思っていました。
例:
一致した値は緑色で表示されます。
一致しない値は赤で表示されます。
2つのファイルがあるとしますfile1
およびfile2
と私のコマンドはdiff file1 file2
。
ここで、出力に5つの不一致が含まれているとすると、それらの不一致は赤色で表示されます。 UNIXを使用してこれを達成する方法?
つまり、「値が一致しない場合のdiffコマンドの出力の色を赤に変更します」
diff --color
オプションがGNU diffutils 3.4(2016-08-08)に追加されました
これは、ほとんどのディストリビューションでのデフォルトのdiff
実装であり、間もなく導入されます。
Ubuntu 18.04にはdiffutils
3.6があるため、それを持っています。
3.5では、次のようになります。
テスト済み:
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
結果:
行が狭すぎる場合(デフォルトは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
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'
。
colordiff file1 file2
をお試しください
Linux/BSDディストリビューションでのcolordiffの利用可能性
DebianまたはUbuntu(またはそれらの派生物)を実行しているユーザーは、おそらく「apt-get install colordiff」を使用してダウンロードおよびインストールできます。 colordiffは、他の多くのLinux、UNIX、BSDディストリビューションおよびオペレーティングシステム用にもパッケージ化されています。
( http://www.colordiff.org/ からの引用)
色付き、単語レベルdiff
ouput
以下のスクリプトと diff-highlight でできることは次のとおりです。
#!/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 にクレジットしてください)
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
ヘルプが必要な場合は、私にメールを送ってください。
よろしく。
現時点でGithubにpythonで構築された本当にきちんとしたツールがあり、icdiff
と呼ばれています。ニース色の出力を生成します。これも「重大度」を認識します。私は常に使用しています。チェックアウトする価値があります。
vimがインストールされている場合は、diff file1 file2 | vim -
Vimはdiff形式を認識し、適切な色を付けます。最後のダッシュは、vimがdiffコマンドからの入力を受け入れるようにするためのものです。
Diffのカラーパレットを変更するには、--palette
オプションを使用します(diffバージョン3.4以降)。
diff --color=always --palette='ad=1;3;38;5;154:de=1;3;38;5;9' file1 file2
ここでad
とde
は、追加されたテキストと削除されたテキストの色をそれぞれ定義します。 diffオプションの詳細な説明については、man diff
またはinfo diff
を参照してください。
注:「サイドバイサイド」出力を取得するには、「-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
このスクリプトは、標準のバージョン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/"
どちらでも使えます
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; }