Convença o grep a gerar todas as linhas, não apenas aquelas com correspondências

Convença o grep a gerar todas as linhas, não apenas aquelas com correspondências

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, grepretorna 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 --colorparâmetro to grepfará 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 greptodas 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

Captura de tela dos dois comandos

Se grepnã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 -Eativa 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 -Ee -Fswitches, 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 ripgrepcom seu --passthruparâ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 fooem vez disso, usar rg "^|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.

informação relacionada