[unix] 컬러 diff 출력을 적게 줄이려면 어떻게합니까?

git diff를 사용하여 컬러 출력을 생성했습니다. 그러나 이제는 보통 diff를 사용해야하며 색상 부족으로 인해 읽기 어려운 많은 출력을 생성합니다. diff로 읽을 수 있고 색상이 지정된 출력물을 만들려면 어떻게해야합니까? 큰 파일을 쉽게 검토 할 수 있도록 파이핑을 적게하는 것이 이상적입니다.



답변

diff색상을 출력 할 수 없으면 다른 프로그램이 필요 colordiff합니다. 터미널의 색상은 ANSI 이스케이프 코드 를 통해 인쇄 되며 기본적으로 덜 해석됩니다. 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"}'


답변

여기에 다른 답변이 오래되었을 수 있습니다. coreutils 3.5부터는 diffstdout이 콘솔이 아닌 경우 기본적으로 꺼져있는 컬러 출력을 생성 할 수 있습니다.

매뉴얼 페이지에서 :

--color[=WHEN]
출력물을 채색하십시오. WHEN할 수있다 never, always또는 auto(기본)

stdout이 파이프 diff --color=always -- "$file1" "$file2" | less -R일 때 컬러 출력을 강제하려면 작동해야합니다.


답변

채색 된 diff를 덜 파이프하려면 :

diff $file1 $file2 | colordiff | less -r

단일 화면으로 제한하여 더 읽기 쉽게하려면 :

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

그리고 화면에 가치가있는 화면이 하나 뿐인 경우 표시되지 않도록하려면 :

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

-F는 내용이 걱정되는 화면이 두 개 미만인 경우 즉시 닫히지 않습니다. stderr로 파이프는 닫을 때 출력을 잃을 때-stderr로 파이프하여 표시하지 않아도 출력을 얻습니다.

대안 (그리고 더 나은 생각) 방법은 화면을 덜 지우는 것을 막기 위해 -X를 사용하는 것입니다.

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

이것은 나에게 잘 작동하지만 bash에만 해당 될 수 있습니다. colordiff는 내장되어 있지 않지만 쉽게 설치할 수 있습니다.


답변