diff 출력을 색칠하는 방법?


18

유닉스 파일을 조건부로 포맷하고 싶었고 현재 diff명령을 사용하고 있으며 diff명령 출력 텍스트의 형식을 지정할 수 있는지 알고 싶었습니다 .

예:

일치하는 값은 녹색으로 표시되어야합니다.
일치하지 않는 값은 빨간색으로 표시되어야합니다.

나는 두 개의 파일이 있다고 가정 file1file2내 명령입니다 diff file1 file2.

이제 출력에 5 개의 불일치가 포함되어 있다고 가정하면 불일치가 빨간색으로 표시되어야합니다. 유닉스를 사용하여 이것을 달성하는 방법?

요약하자면, "일치하지 않는 값에 대한 diff 명령의 출력에 대해 색상을 빨간색으로 변경하십시오"


2
의 가능한 중복
FloHimself

"match"와 "mismach"라는 용어는 약간 혼동됩니다. 어쨌든 diff 3.4 이상에는 --color 옵션이 있습니다.
Gerry Lufwansa '

답변:


24

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를 요청 diff-highlight했습니다. [Diffutils-devel] git의 diff-h와 같은 컬러 출력을 생성하는 플래그 추가 | list.gnu.org

커밋 c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (2015 년 3 월)에 추가되었습니다.


1
우수한! 이것을 기본적으로 활성화하려면 : alias diff='diff --color=auto'
Tom Hale

1
다음 은 설명서입니다.
Alexey

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 컬러 이스케이프 코드는 빨강, 녹색하세요 ANSI-C는 인용 액세스 셸에서 \e탈출을.

--old-group-format--new-group-format일치하지 않는 행을 식별하고 사용하는 붉은 색과 색 리셋 코드간에 삽입 %<%>동시에, --unchanged-group-format삽입은 녹색과 리셋 코드 사이의 라인을 일치.

모든 라인에서 중복 색상 이스케이프를 희생시키면서 (etc)를 사용할--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 오류와 유사합니다.
Aman

한 번에 한 줄씩 명령을 실행할 때 Hormer는 줄 바꿈 없음 -bash-4.2 $ --new-group-format = $ '\ e [0; 31m %> \ e [0m'\ >
Aman

기본적으로 구성 할 수 있습니까?
Eugen Konkov

@EugenKonkov 쉘에서 별칭 또는 함수를 설정하여이를 실행할 수 있습니다 diff.
마이클 호머

이로 인해 작동을 시도하는 데 약간의 문제가 발생했습니다. 변경되지 않은 물건을 보여주는 추가로 ... colordiff 포기하고 설치
브라이언 피터슨

9

시험 colordiff file1 file2

Linux / BSD 배포판으로 colordiff의 가용성

데비안 또는 우분투 (또는 그 파생어)를 실행하는 사용자는 아마도 "apt-get install colordiff"를 사용하여 다운로드하여 설치할 수 있습니다. colordiff는 또한 여러 다른 Linux, UNIX 및 BSD 배포 및 운영 체제 용으로 패키지됩니다.

( http://www.colordiff.org/ 에서 인용 )


1
완전한. 나를 위해, diff --color=auto라인 마커를 채색하고 각 +/ -섹션 의 첫 번째 라인 만 사용했습니다 . less -SR쉽게 탐색 할 수 있도록 파이핑합니다 .
Walf

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/hlhttp://www.flashnux.com/notes/page_000022_US.html 에서 사용 가능한 명령을 살펴 봐야합니다 .

hlC로 작성된 Linux 명령으로, 특히 텍스트 파일이나 명령의 출력을 채색하도록 설계되었습니다. 최대 42 개의 색상을 동시에 사용할 수 있으며 구성 파일을 사용하여 명령 줄을 단순화 할 수 있습니다. 다른 명령으로 파이프 될 수있는 모든 명령의 출력을 채색 할 수 있습니다. 정규식이 무엇인지 아는 경우 사용하기가 매우 쉽습니다. man페이지를 사용하여 페이지 사용법 을 이해할 수 있습니다 .
hl사용 및 구성이 매우 쉽습니다. hl_generic 스크립트를 사용하여 구문을 수정하지 않고 명령 출력에 색상을 지정할 수도 있습니다 .
예를 들어 diff일반적인 명령을 입력하여 명령 의 출력을 채색 할 수 있습니다 .

diff file1 file2

도움이 필요하면 이메일을 보내주세요.
문안 인사.


1

Github에 python으로 빌드 된 정말 깔끔한 도구가 있습니다 icdiff. "심각도"를 인식하는 멋진 색상의 출력물을 생성합니다. 나는 그것을 항상 사용할 가치가 있으며 체크 아웃 할 가치가 있습니다.


1

vim을 설치했다면 할 수 있습니다 diff file1 file2 | vim -

Vim은 diff 형식을 인식하고 적절한 채색을합니다. 끝에 대시는 vim이 diff 명령의 입력을 받아들이도록하는 것입니다.


'view'(vim에 대한 읽기 전용 바로 가기)가이 목적에 더 적합합니다.
Anupam Srivastava

1

Generic Colouriser ( grc )를 설치 하고 다음을 수행하십시오.

grc diff file1 file2

Linux 및 MacOS에서 모두 사용할 수 있습니다.


0

사용할 수 있습니다

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. My Favourite : 다음 git diff file1 file2과 같이 구현됩니다.

나는 현재 다음을 사용 하여 출력을 사용 git diff 하거나 파이핑 중입니다 colordiff.

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


나도 좋아 git diff --no-index하지만 파일을 찾아야한다고 생각합니다. (적어도 나를 위해 bash 프로세스 대체로 작동하지 않습니다)
Karl

@Karl 그 부분을 알아 내십시오. 아마도 터미널 설정을 사용하여 탐색 할 수있는 다른 방법이있을 수 있습니다. git diff오랫동안 사용해 왔으며 파일을 찾을 수 있습니다. 그렇지 않으면 올바르게 사용하지 않을 것입니다.
himanshuxd

2
아마도 나는 분명하지 않았다. (어리석은) 예로서, 이것은 나를 위해 작동하지만와 diff --color <(ls | head -n+3) <(ls | tail -n +5)함께 작동 하지 않습니다 git diff. 틀림없이, 일반적인 경우가 아니거나 해결하기가 너무 어렵습니다.
Karl

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

이 스크립트는 표준 pre-version 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

문자 수준의 색상 차이 : ccdiff 설치

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

ccdiff의 출력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.