色は一致しますが、他の行も印刷します。 [重複]

色は一致しますが、他の行も印刷します。 [重複]

私はエイリアスを持っています: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オプションはすべての行を印刷します。

関連情報