coloração condicional usando a expressão perl

1

Eu tenho dois comandos em perl e um arquivo de teste test.txt :

$ cat test.txt
aaa bla
bbb foo
#ccc bar
ddd 444

A primeira expressão perl colore qualquer ocorrência de aaa ou bbb com a cor vermelha:

cat test.txt | perl -pe "s/(aaa|bbb)/\e[1;31m3[0m/g"

A segunda expressão coloriza em verde qualquer linha que comece com # :

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m3[0m/g"

Agora preciso combinar essas duas expressões em uma, com as seguintes propriedades:

se a linha começar com # , corse toda a linha usando a cor verde. Se a linha não começar com # , corrija qualquer ocorrência de aaa ou bbb usando a cor vermelha.

Em outras palavras, se a linha já estiver verde (isto é, típica; linha de comentário), não desejo colorir a possível ocorrência de aaa ou bbb . Caso contrário, quero colorizá-los em vermelho.

Como eu poderia combinar minhas duas expressões para conseguir isso?

    
por Martin Vegter 20.09.2015 / 19:56

1 resposta

1

A maneira mais simples de fazer isso seria:

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m3[0m/g || s/(aaa|bbb)/\e[1;31m3[0m/g"

Isso usa o lógico ou operador || para informar ao perl para executar somente o segundo s/// se o primeiro falhar. ou seja, semelhante a um if (/#/) ... else if (/aaa|bbb/) ...

Você pode adicionar mais || s/// no final do script, se precisar, mas se precisar pesquisar e colorir muitas outras correspondências, fazer isso como uma linha de ação ficaria muito distante muito complicado. Nesse caso, reescreva tudo como um script #! /usr/bin/perl -p independente, talvez com um s///g || por linha e um ponto e vírgula final em vez de || na última linha.

Por exemplo:

#! /usr/bin/perl -p

s/^(#.*)/\e[0;32m3[0m/g ||
s/(aaa|bbb)/\e[1;31m3[0m/g || 
s/(ccc)/\e[1;34m3[0m/g ;

Observe que fazer isso significa que apenas uma partida será encontrada em qualquer linha e a primeira partida vence. Portanto, no meu exemplo de script mais longo acima, se 'aaa' ou 'bbb' forem encontrados em uma linha, eles serão coloridos, mas se 'ccc' estiver na linha mesmo , não será.

Finalmente, parece que você está reinventando a roda. Existem várias ferramentas que já existem para colorir o texto. A ferramenta destaque , por exemplo. É usado principalmente para destacar a sintaxe do código-fonte, mas pode ser usado para colorir qualquer tipo de texto.

    
por 21.09.2015 / 03:28