grep duas condições, uma negada, sem um pipeline?

3

Suponha que tenhamos o seguinte test.txt :

# commented line, no match
# commented line, would match /app/
# again commented, would match app
non commented line, matchin /app
non commented line, no match

Eu gostaria de obter todas as linhas que contenham a palavra ' app ', - mas não aquelas que têm um comentário, - e eu gostaria que o nome do arquivo fosse enviado.

O grep -H 'app' test.txt trivial, obviamente, corresponde a tudo e não evita linhas que começam com o número / caractere hash # :

Umpipelinecomumasegundaopçãogrepcom-v,--invert-matchgeralmenteatrapalhaascorese,parapreservarosnomesdearquivos-H,nãoseriapossívelespecificarumacorrespondêncianegadapara^#(ouseja,umnúmero/caracteredehashnoiníciodeumalinha),entãoeuteriaqueusarumaferacomogrep-Happtest.txt--color=always|grep-v'\[K:.\[m.\[K#'parapreservarascores:

... mas somente depois de fazer algo como grep -H app test.txt --color=always | hexdump -C para que eu possa ver a combinação certa de caracteres, que é, falando levemente, tediosa.

E, infelizmente, aparentemente não é possível usar a opção -v para especificar seu próprio padrão (negado) em uma combinação com a opção -e PATTERN, --regexp=PATTERN , que pode especificar vários padrões de pesquisa:

:tmp$ grep -H -e 'app' -v '^#' test.txt
grep: ^#: No such file or directory
test.txt:# commented line, no match
test.txt:non commented line, no match
test.txt:

Aqui, grep interpreta '^#' para ser um nome de arquivo, não um padrão de pesquisa - então o -v inverte a correspondência de app e eu recebo os resultados errados do esperado. Caso contrário, neste exemplo, a saída esperada é apenas uma linha:

test.txt:non commented line, matchin /app

... com nome de arquivo colorido corretamente e correspondências.

Então, existe uma maneira de conseguir isso - mas sem o pipeline confuso acima, e simplesmente usando ^# como o padrão a ser evitado?

    
por sdaau 11.12.2015 / 04:00

1 resposta

5
grep -E '^([^#].*)?app' ./infiles* /dev/null

Eu acho que os comentários já quase o fizeram, mas se você fizer o cabeçalho da linha [^#] não-comentar coincidir com ? opcional, então você pode obter linhas que começam com a correspondência app ou você obtém linhas que começam com outra coisa e depois combinam com app - mas de qualquer forma, você não recebe linhas que começam com # .

Com relação às cores - bem ... isso depende do grep e do regexp, mas um grep padrão do GNU deve destacar todo o jogo até a última correspondência app . Se você gostaria que fosse mais específico, você pode fazer info grep para dar uma olhada no ambiente que um GNU grep considerará ao destacá-lo e configurá-lo apropriadamente, ou, na falta de um resultado satisfatório nesse sentido, realçar você mesmo.

    
por 11.12.2015 / 05:34

Tags