색상은 일치하지만 다른 줄도 인쇄합니다. [중복]

색상은 일치하지만 다른 줄도 인쇄합니다. [중복]

나는 별칭을 가지고 있습니다: alias grep='grep --color=auto'일치하는 행뿐만 아니라 색상 일치 패턴과 함께 모든 행을 인쇄할 수 있는 방법이 있기를 바랍니다. 이 작업을 자체적으로 수행할 수 있는 옵션이 있는지 의심됩니다 grep. 다른 도구가 있나요? 아니면 이것을 달성하는 방법에 대한 아이디어가 있습니까?

답변1

-E다음 옵션을 사용하여 이 트릭을 수행 할 수 있습니다 .

grep -E '(^|pattern)' file

다음은 간단한 출력입니다.

여기에 이미지 설명을 입력하세요.

답변2

sed약간의 터미널 마법을 사용하여 이 작업을 수행 할 수 있습니다 .

$ sed -e 's/<pattern>/\x1b[31;01m&\x1b[m/g' <file>

이는 ("전경색을 굵은 빨간색으로 설정"에 대한 터미널 이스케이프 시퀀스) 및 ("전경색을 기본값으로 설정"과 동일)로 <pattern>둘러싸인 일치하는 텍스트로 각 항목을 대체합니다.\x1b[31;01m\x1b[m

답변3

나는 귀하가 제공하는 모든 문자열에 색상을 지정하는 작은 스크립트를 작성했습니다.

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

EoF
      exit(0);
    }

my $case_sensitive=$opts{i}||undef;
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
           'bold magenta', 'bold cyan', 'yellow on_magenta', 
           'bright_white on_red', 'bright_yellow on_red', 'white on_black');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
        }
      }
    }
    print STDOUT $line;
}

color디렉터리에 저장 $PATH하고 실행 가능하게 만들면( chmod +x /usr/bin/color) 다음과 같은 패턴 일치 색상을 지정할 수 있습니다.

echo -e "foo\nbar\nbaz\nbib" | color -l foo,bib 

그러면 다음이 생성됩니다.

  여기에 이미지 설명을 입력하세요.

작성된 대로 스크립트에는 10개의 서로 다른 패턴에 대해 미리 정의된 색상이 있으므로 위의 예와 같이 쉼표로 구분된 목록을 제공하면 일치하는 각 패턴에 다른 색상이 지정됩니다.

답변4

이것은 내장되어 있습니다확인하다--컬러 출력이 기본값이며, 이 --passthru옵션은 모든 라인을 인쇄합니다.

관련 정보