
Digamos que eu tenha o seguinte arquivo:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Por padrão, grep
retorna cada linha que contém o termo de pesquisa:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Passar o --color
parâmetro to grep
fará com que ele destaque a parte da linha que corresponde à expressão de pesquisa, mas ainda assim retornará apenas as linhas que contêm a expressão. Existe uma maneira de gerar grep
todas as linhas do arquivo de origem, mas destacar as correspondências?
Meu terrível truque atual para conseguir isso (pelo menos em arquivos que não possuem mais de 10.000 linhas consecutivas sem correspondências) é:
$ grep -B 9999 -A 9999 test test
Se grep
não for possível fazer isso, existe outra ferramenta de linha de comando que ofereça a mesma funcionalidade? eu brinquei comack
, mas também não parece ter uma opção para isso.
Responder1
grep --color -E "test|$" yourfile
O que estamos fazendo aqui é comparar o $
padrão e o padrão de teste, obviamente $
não tem nada para colorir, então apenas o padrão de teste ganha cor. Apenas -E
ativa a correspondência estendida de regex.
Você pode criar uma função facilmente assim:
highlight () { grep --color -E "$1|$" "${@:1}" ; }
Responder2
ack --passthru --color string file
para Ubuntu e Debian, use ack-grep em vez de ack
ack-grep --passthru --color string file
Responder3
Outra maneira de fazer issoapropriadamenteeportávelwith grep
(além de usar duas regexes com alternância como na resposta aceita) é através do padrão nulo (e respectivamente string nula).
Deve funcionar igualmente bem com ambos -E
e -F
switches, pois,de acordo com o padrão:
-E
Match using extended regular expressions.
[...] A null ERE shall match every line.
e
-F
Match using fixed strings.
[...] A null string shall match every line.
Então é simplesmente uma questão de correr
grep -E -e '' -e 'pattern' infile
e respectivamente
grep -F -e '' -e 'string' infile
Responder4
ripgrep
Use ripgrep
com seu --passthru
parâmetro:
rg --passthru pattern file.txt
É um dosferramentas grep mais rápidas, já que é construído sobreMotor regex do Rustque usa autômatos finitos, SIMD e otimizações literais agressivas para tornar a pesquisa muito rápida.
--passthru
- Imprima linhas correspondentes e não correspondentes.Outra maneira de obter um efeito semelhante é modificando seu padrão para corresponder à string vazia. Por exemplo, se você estiver pesquisando usando,
rg foo
em vez disso, usarrg "^|foo"
emitirá todas as linhas em todos os arquivos pesquisados, mas apenas as ocorrências de foo serão destacadas. Este sinalizador permite o mesmo comportamento sem a necessidade de modificar o padrão.