Використання порожнього рядка як контекстного "роздільника групи" для grep


12

Мені потрібен греп-вихід з контекстом, кольором та порожніми рядками як роздільник групи. У цьому запитанні я дізнався, як визначити користувальницький group-separator, і я сконструював свою команду grep так:

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

але роздільник групи насправді не порожній, натомість він все ще містить код кольору (тобто [[36m[[K[[m[[K). Це тому, що я використовую --color=always. Але мені потрібен колір у моїй команді grep, і мені потрібен роздільник, щоб бути порожнім рядком (для подальшої обробки)

Як я можу поєднати ці дві умови?


Якщо у вас --color=alwaysвідповідність буде надруковано кольором, а якщо ви --group-separator=""встановили порожній рядок, ви отримаєте порожній рядок після відповідної групи. Повторіть спробу, залишивши --group-separator=""порожній рядок, а не конкретний колір, а потім поясніть, що не працює.
bsd

@bdowning - це те, що спробувала ОП. Код, який він згадує, не видно у висновку терміналу. Спробуйте передати висновок, od -cщоб побачити приховані символи, які відображаються в порожніх рядках.
тердон

@terdon, я бачу це od.
bsd

Відповіді:


9

Якщо ви використовуєте GREP_COLORSзмінну середовища, ви можете контролювати конкретні кольори для кожного типу відповідності. man grepпояснює використання змінної.

Наступна команда надрукує кольорову відповідність, але нічого у рядку, що розділяє групу, нічого, а лише порожній рядок. По трубі odви побачите кольорові втечі до і після матчу, але лише \n\nв груповому розділенні.

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

Якщо не встановити seкомпонент, пригнічується друк кольорів у груповому розділювачі.

Оскільки в моєму прикладі вище використовуються всі значення за замовчуванням для GREP_COLORSнаступного, також буде працювати.

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

Якщо ви не використовуєте bashподібну оболонку, вам може знадобитися спочатку експортувати GREP_COLORS.


5

Особисто я це роблю, використовуючи Perl, ні grep. У мене є невеликий сценарій, який виділить заданий візерунок кольором:

#!/usr/bin/env perl
use Getopt::Std;
use strict;
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;
}

Якщо ви збережете це на своєму шляху як color, ви можете отримати бажаний результат, запустивши

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

Таким чином, сценарій розфарбує відповідність для вас, і ви можете сказати grepне використовувати кольори і уникнути цієї проблеми.


Будь ласка, @terdon додайте його до суті і зв’яжіть його тут, щоб було легше прослідкувати будь-яку еволюцію.
Рафарейно

@Rafareino так, боюся, я не дуже використовую такі інструменти. У мене насправді є сховище, але воно дуже рідко оновлюється. Я зберігаю сенс налаштувати його та використовувати його належним чином, але я, здається, ніколи не обійдусь цим.
terdon

Тож я зробив невелику корекцію тут, на жаль, мені потрібно було включити коментар, щоб досягти мінімальної редакції @terdon
Rafareino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.