업데이트:

업데이트:

grep한 명령의 출력을 다른 명령으로 파이프하고 있습니다 grep. 첫 번째는 을 grep사용하여 --color=always첫 번째 일치 항목에 색상이 지정됩니다. 실제로 이는 두 가지 색상 코드, 즉 \033[1;31m및 사이에 일치 항목이 포함되어 있음을 의미합니다 \033[0m.

이제 문제는 두 번째 패턴이 이면 m이전 일치 항목의 색상 코드와 일치한다는 것입니다.

echo A B C | grep --color=always A | grep m

마찬가지로 숫자 31도 일치합니다.

이 문제를 해결할 방법이 있나요?

업데이트:

나는 성냥을 색칠해야 한다는 것은 말할 필요도 없이 진행될 것이라고 예상했기 때문에 제거하는 것은 --color=always나에게 만족스러운 해결책이 아닙니다.

답변1

를 사용하지 마십시오 grep --color=always. 이것이 바로 GNU grep(및 어쩌면 다른 사람들)도 grep --color=autowhich가 grep --coloralone (from man grep)과 동일한 이유입니다.

   --color[=WHEN], --colour[=WHEN]
          Surround  the  matched  (non-empty)  strings,  matching   lines,
          context  lines,  file  names,  line  numbers,  byte offsets, and
          separators (for fields and groups of context lines) with  escape
          sequences  to display them in color on the terminal.  The colors
          are  defined  by  the  environment  variable  GREP_COLORS.   The
          deprecated  environment  variable GREP_COLOR is still supported,
          but its setting does not have priority.  WHEN is never,  always,
          or auto.

이것이 더 자세히 문서화된 위치를 찾을 수는 없지만 기본적으로 출력이 grep파일인지 터미널인지 파이프인지 여부를 감지하고 그에 따라 작동합니다.

$ echo foo | grep --color=always o | grep m
f[01;31mo[m[01;31mo[m
$ echo foo | grep --color=always o >outfile; grep m outfile
f[01;31mo[m[01;31mo[m

위와 비교해보세요

$ echo foo | grep --color o >outfile; grep m outfile
$ echo foo | grep --color o | grep m 
$ 

따라서 이 auto옵션을 사용하면 기본적으로 색상을 볼 수 있는 경우에만 색상이 인쇄됩니다. 정말 영리하고 매력처럼 작동합니다. 나는 다음과 같은 것을 가지고 있습니다:

$ type grep
grep is aliased to `grep --color'

답변2

--color그만한 가치가 있기 때문에 이것이 기본값이 --color=autoand not 인 이유입니다 --color=always.

목표가 " Am일치하는 A문자 를 모두 포함하는 모든 줄 표시 m"라면 가장 간단한 해결책은 하나의 egrep을 사용하여 강조 표시를 다시 추가하여 모든 일치 후에 강조 표시를 수행하는 것 같습니다. 다음과 같은 것 :

{
    echo "A b";
    echo "A m";
    echo "B m";
    echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';

답변3

실제 사용 사례는 무엇입니까? A다음을 포함하는 모든 줄에 색상을 지정하려면 s를 m간단히 반대로 하면 됩니다 grep.

echo A B C | grep m | grep --color=always A

m또는 원본 출력에서 ​​리터럴을 찾는 경우 이전에 모든 색상 코드를 제외 grep m하고 결과를 인쇄 해야 합니다.~와 함께색상 코드. 이를 수행하는 한 가지 방법은 를 사용하여 nl출력의 행에 번호를 매기는 것입니다. grep행 번호 뒤에 가 있으면 m해당 출력의 행 번호만 저장한 다음 sed -n색상으로 구분된 출력의 행만 인쇄하는 데 를 사용합니다.

관련 정보