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-match
geralmenteatrapalhaascorese,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?