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?