Grep -H nem sempre retornando o caminho do arquivo quando duas correspondências estão na mesma linha

2

Estou usando o grep para examinar de forma recursiva os arquivos e extrair todas as strings correspondentes a um padrão. Eu quero imprimir o caminho do arquivo: string correspondente.

-H should print the file path for each entry

-o should print just the matched string, omitting everything else on the line I don't want

-r recursive search.

Eu corro:

grep -Hro [pattern] .

A maioria das correspondências é impressa com o nome do arquivo, no entanto, algumas imprimem a string correspondente. São -H e -o mutuamente exclusivos em que -o está aparando o nome do arquivo? Exemplo de saída:

./path/foo.txt: foo
./path/bar.txt: foo
./path/baz.txt: foo
foo
./path/baz.txt: foo

A quarta partida foo também deve ter um arquivo associado a ela, mas ela não está sendo impressa.

Estou obtendo um comportamento semelhante a este postar , no entanto, estou usando o sinalizador -H, e a solução "/ dev / null" também não funciona.

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

EDITAR:

Depois de explorar cada partida em que o regex não estava obtendo o nome do arquivo, todos eles ocorrem quando duas strings são correspondidas na mesma linha. Por exemplo, este arquivo de texto

foo
foo sometext foo
foo

Saídas

./path/foo.txt: foo
./path/foo.txt: foo
foo
./path/foo.txt: foo

Alguém conhece uma solução para obter as duas correspondências para imprimir um nome de arquivo?

    
por Justin Olson 21.09.2017 / 23:48

1 resposta

2

Não, -H e -o não são mutuamente exclusivos. Você pode ter um caractere de retorno de carro na parte correspondente. Isso faria com que o seguinte texto fosse escrito no início da linha, sobrescrevendo o nome do arquivo.

$ printf 'foobar\n' | grep -Ho '.bar'
(standard input):obar

$ printf 'foo\rbar\n' | grep -Ho '.bar'
bar

Além disso, como as duas linhas pertencem ao mesmo arquivo baz.txt (se o seu exemplo estiver correto), isso também pode ser devido a uma linha longa (maior que a largura da tela) ser quebrada na próxima linha.

$ printf 'foo%80sbar\n' | grep -Ho 'foo.*'
(standard input):foo
       bar

Se um desses cenários pode se aplicar à sua situação, realmente depende da sua regex de pesquisa e do conteúdo de seus arquivos.

    
por 22.09.2017 / 00:01