Utiliser la ligne vide comme context "group-separator" pour grep

J'ai besoin de la sortie grep avec le context, la couleur et les lignes vides comme séparateur de groupe. Dans cette question , j'ai appris à définir un group-separator personnalisé, et j'ai construit ma command grep comme ceci:

 grep --group-separator="" --color=always -A5 

mais le séparateur de groupe n'est pas vide, mais il contient toujours le code de couleur (ie [[36m[[K[[m[[K )]. C'est parce que j'utilise --color=always . Mais j'ai besoin de couleur dans ma command grep, et j'ai besoin d'un séparateur pour être en blanc (pour un traitement ultérieur)

Comment puis-je combiner ces deux conditions?

Si vous utilisez la variable d'environnement GREP_COLORS , vous pouvez contrôler des colors spécifiques pour chaque type de correspondance. man grep explique l'utilisation de la variable.

La command suivante imprimera une correspondance colorée, mais rien sur la ligne qui sépare le groupe, juste une ligne vide. Pipé à travers vous verrez la couleur s'échapper avant et après le match, mais seulement \n\n lors de la séparation de groupe.

 GREP_COLORS='ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=' grep --group-separator="" --color=always -A5 

Le fait de désactiver le composant se supprime l'printing de la couleur dans le séparateur de groupe.

Puisque mon exemple ci-dessus a utilisé toutes les valeurs par défaut pour GREP_COLORS les éléments suivants fonctionneront également.

 GREP_COLORS='se=' grep --group-separator="" --color=always -A5 

Si vous n'utilisez pas un bash comme shell, vous devrez peut-être d'abord exporter GREP_COLORS .

Personnellement, je le fais en utilisant Perl, pas grep . J'ai un petit script qui mettra en évidence un motif en couleur:

 #!/usr/bin/env perl use Getopt::Std; use ssortingct; use Term::ANSIColor; my %opts; getopts('hsc:l:',\%opts); if ($opts{h}){ print<<EoF; DESCRIPTION $0 will highlight the given pattern in color. USAGE $0 [OPTIONS] -l PATTERN FILE If FILE is ommitted, it reads from STDIN. -c : comma separated list of colors -h : print this help and exit -l : comma separated list of search patterns (can be regular expressions) -s : makes the search case sensitive EoF exit(0); } my $case_sensitive=$opts{s}||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'); ## user provided color if ($opts{c}) { @color=split(/,/,$opts{c}); } ## read patterns my @patterns; if($opts{l}){ @patterns=split(/,/,$opts{l}); } else{ die("Need a pattern to search for (-l)\n"); } # 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; } 

Si vous enregistrez votre path sous forme de color , vous pouvez get la sortie désirée en exécutant

 grep --group-separator="" --color=never -A5 foo | color -l foo 

De cette façon, le script colorise les correspondances pour vous et vous pouvez dire à grep ne pas utiliser de colors et d'éviter ce problème.