Boş satırın grep için bağlam “grup ayırıcı” olarak kullanılması


12

Grup ayırıcı olarak bağlam, renk ve boş çizgiler ile grep çıktı gerekir. Bu soruda , özel tanımlamayı öğrendim group-separatorve grep komutumu şu şekilde oluşturdum:

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

ancak grup ayırıcısı aslında boş değildir, bunun yerine hala renk kodunu (ie [[36m[[K[[m[[K) içerir. Çünkü kullanıyorum --color=always. Ama grep komutumda renk lazım ve boş satır olmak için ayırıcıya ihtiyacım var (daha fazla işlem için)

Bu iki durumu nasıl birleştirebilirim?


Eşleşmeniz --color=alwaysrenkle yazdırılırsa --group-separator=""ve boş dizeye ayarladıysanız, eşleşen grubunuzdan sonra boş bir satır alırsınız. Lütfen --group-separator="", belirli bir renk kaçışını değil, boş dizeyle bırakmayı deneyin ve ardından neyin çalışmadığını açıklayın.
BSD

@bdowning OP bunu denedi. Bahsettiği kod terminal çıkışında görünmez. od -cBoş satırlarda görünen gizli karakterleri görmek için çıktıyı iletmeyi deneyin .
terdon

@terdon, görüyorum od.
BSD

Yanıtlar:


9

GREP_COLORSOrtam değişkenini kullanırsanız, her bir eşleme türü için belirli renkleri denetleyebilirsiniz. man grepDeğişkenin kullanımını açıklar.

Aşağıdaki komut renkli bir eşleşme yazdırır, ancak grubu ayıran satırda hiçbir şey yoktur, yalnızca boş bir satırdır. Pipetlendi odmaçtan önce ve sonra renk kaçışını göreceksiniz, ama sadece \n\ngrup ayrımında.

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

Bileşenin ayarının sekaldırılması, grup ayırıcısında renk baskısını bastırır.

Yukarıdaki örneğim kullanıldığından GREP_COLORS, aşağıdakiler için varsayılan değerlerin tümü de çalışacaktır.

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

bashBenzer bir kabuk kullanmıyorsanız , GREP_COLORSönce dışa aktarmanız gerekebilir .


5

Şahsen bunu Perl kullanarak yapıyorum, değil grep. Renk verilen bir deseni vurgulayacak küçük bir komut dosyası var:

#!/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;
}

Bunu yolunuza olarak colorkaydederseniz, istediğiniz çıktıyı çalıştırarak alabilirsiniz.

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

Bu şekilde, komut dosyası eşleşmeleri sizin için renklendirir ve greprenkleri kullanmamanızı ve bu sorundan kaçınmanızı söyleyebilirsiniz .


Bir eklemek @terdon Lütfen Ana fikir ve herhangi bir evrimi takip etmek daha kolay olacak, böylece buraya bağlamak.
Rafareino

@Rafareino evet, korkarım bu araçları gerçekten kullanmıyorum. Aslında bir havuzum var ama çok nadiren güncelleniyor. Ben bir tane kurmak ve düzgün kullanmak anlamını devam ama asla onu almak gibi görünmüyor.
terdon

Bu yüzden burada küçük bir düzeltme yaptım, ne yazık ki, minimum düzenlemeye ulaşmak için bir yorum eklemem gerekiyordu @terdon
Rafareino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.