Gostaria de procurar texto que possa ser dividido em várias linhas em um arquivo. Um grep que ignoraria quebras de linha e retornaria o intervalo de linhas correspondente.
por exemplo, eu estaria procurando is an example file
e espero que seja encontrado no seguinte arquivo:
Este é
um
arquivo de exemplo.
Para não depender de espaços iniciais ou finais, ignorar completamente todas as formas de espaço em branco pode ser o melhor (idealmente, tratar qualquer sequência de espaço em branco como um espaço único).
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.
text-processing
grep
search
newlines
Nikana Reklawyks
fonte
fonte
isearch-forward
)/This\_sis
. Para mais detalhes::help \_s
.Respostas:
O GNU
grep
pode fazer issoPara preencher alguns pontos que surgem nos comentários, existem algumas modificações no script:
Em relação a arquivos grandes, não tenho imaginação para limitar a memória, mas no caso de problemas, você é livre para usar
sed
que mantêm não mais que 4 linhas (porque 4 palavras no padrão) na memória (
\(\n.*\)\{3\}
).fonte
-z
opção dizgrep
para tratar as novas linhas como caracteres de texto comuns e procurar nul bytes para separar registros. Em um arquivo de texto sem bytes nulos (isto é, o caso típico),grep -z
o arquivo inteiro será tratado como uma linha. Portanto, (1) isso levanta a questão de quão bem ele pode lidar com arquivos grandes e (2) se encontrar uma correspondência, ela escreverá o arquivo inteiro, sem nenhuma pista sobre a localização da correspondência. Além disso (3), o OP disse: “idealmente, tratando qualquer sequência de espaço em branco como um espaço único”; portanto, você deve usar\s+
e adicionar-E
.-o
; Eu continuo esquecendo disso. Maneira inteligente de usá-lo. (1) Sua novagrep
resposta começa^[\n]*
; isso é um erro de digitação[^\n]*
. (2) eu disse\s+
deliberadamente.be\s*little
irá corresponderbelittle
ecare\s*less
irá correspondercareless
. Mas acho que esse é um problema menor. E, se você não quiser usar-E
, poderá usar a "versão do pobre homem" de\s+
, a saber\s\s*
,. (3) bomsed
comando. Pode falhar se houver linhas em branco (portanto, a frase de quatro palavras pode se espalhar por mais de quatro linhas); Consegui consertar isso adicionandos/\n\s*\n/\n/
.-E
você, o aço pode ser usado+
em\s\+
forma. Linhas vazias dentro do padrão parecem ser artificial.grep
frases.Tente o seguinte:
fonte
\s
5 vezes se procurar por "este é um padrão muito longo"?\s
corresponde a espaços e a nova linha é um "espaço".This\nis a very\nlong pattern
, e não sei onde as quebras de linha podem ocorrer. Eu teria que procurarThis\sis\sa\svery\slong\spattern
, certo? (que se torna fastidioso como o comprimento do padrão aumenta ou é colado a partir de outro local)pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
.