Como procurar texto em um arquivo ignorando novas linhas?

10

Eu gostaria de pesquisar por texto que pode ser dividido em várias linhas em um arquivo. Um grep que ignore as quebras de linha e retorne o intervalo de linhas correspondente.

por exemplo. Eu estaria procurando por is an example file e espere que ele seja encontrado no seguinte arquivo:

This is
an
example file.

Para não depender de espaços à esquerda ou à direita, ignorar completamente todas as formas de espaço em branco pode ser melhor (idealmente, tratar qualquer sequência de espaço em branco como um único espaço).

Uma solução não ideal é tr '\n' ' ' | grep , que discrimina entre correspondências e não correspondências, mas não mostra a correspondência nem lida bem com arquivos grandes.

    
por Nikana Reklawyks 18.05.2015 / 19:22

2 respostas

11

O% GNUgrep pode fazer isso

grep -z 'is\san\sexample\sfile.' file

Para preencher alguns pontos que surgem nos comentários, há algumas modificações no script:

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

Em relação a arquivos enormes, não tenho imaginação para limitar a memória, mas, no caso de problemas, você está livre para usar sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

que não mantém mais de 4 linhas (porque 4 palavras no padrão) na memória ( \(\n.*\)\{3\} ).

    
por 18.05.2015 / 19:55
7

Tente isto:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT
    
por 18.05.2015 / 19:30