Cor a expressão regular no mesmo arquivo

1

Eu tenho um arquivo grande e preciso examinar determinados padrões. e também procurar por outros padrões baseados no primeiro padrão e, portanto, isso requer colorir as linhas que correspondem à pesquisa no mesmo arquivo.

O principal requisito aqui é que eu preciso ter essas cores salvas no meu arquivo de texto original e não apenas no terminal

por exemplo

line
lactose
galactose
glusocse
lactose
lactos

e eu preciso procurar por lactose, bem como para colorir a lactose (por exemplo, amarelo)

    
por Trupti 26.01.2015 / 16:27

2 respostas

2

Eu escrevi um script para isso:

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

my %opts;
getopts('himc: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 omitted, 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)
-m : only print matching lines (grep-like)
-s : makes the search case sensitive

EoF
    exit(0);
}

my $case_sensitive=$opts{s}||undef;
my $only_matching=$opts{m}||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 $matched;
    for (my $c=0; $c<=$#patterns; $c++) {
    if ($case_sensitive) {
        if (/$patterns[$c]/) {
        s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge && $matched++; 
        }
    } else {
        if (/$patterns[$c]/i) {
        s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige && $matched++; 
        }
    }
    }
    ## Skip non-matching lines
    if ($only_matching) {
        next unless $matched;
    }

    print STDOUT;
}

Salve o arquivo como ~/bin/color , torne-o executável ( chmod 755 ~/bin/color ) e, em seguida, execute-o, fornecendo uma lista separada por vírgulas de padrões para colorir:

Assim,paracoloriraslinhasdoarquivodeentrada,vocêpodeusaroscriptacima,redirecionarasaídaparaumnovoarquivoerenomearooriginal:

    
por terdon 09.10.2015 / 19:18
0

Digite o seguinte comando:

sudo nano /etc/bash.bashrc

Pressione PgDn até chegar ao fim.

Copie e cole o seguinte texto:

alias grep-grey="GREP_COLOR='1;30' grep --color=always"
alias grep-red="GREP_COLOR='1;31' grep --color=always"
alias grep-green="GREP_COLOR='1;32' grep --color=always"
alias grep-yellow="GREP_COLOR='1;33' grep --color=always"
alias grep-blue="GREP_COLOR='1;34' grep --color=always"
alias grep-magenta="GREP_COLOR='1;35' grep --color=always"
alias grep-cyan="GREP_COLOR='1;36' grep --color=always"
alias grep-white="GREP_COLOR='1;37' grep --color=always"

Pressione Ctrl + X então Y e então Digite

Sair de todos os terminais

Digite um novo terminal e digite:

grep-yellow lactose /path/to/file

e olhem maravilhados! ; -)

    
por Fabby 27.01.2015 / 21:59