Je voudrais rechercher du texte qui peut être divisé en plusieurs lignes dans un fichier. Un grep qui ignorerait les sauts de ligne et retournerait la plage de lignes correspondante.
par exemple, je rechercherais is an example file
et je m'attends à ce qu'il se trouve dans le fichier suivant:
Ceci est
un
exemple de fichier.
Pour ne pas dépendre d'espaces de début ou de fin, ignorer entièrement toutes les formes d'espace blanc peut être préférable (idéalement, traiter toute séquence d'espace blanc comme un seul espace).
Une solution non idéale consiste à faire la tr '\n' ' ' | grep
distinction entre les correspondances et les non-correspondances, mais n'affiche pas la correspondance et ne traite pas bien les gros fichiers.
text-processing
grep
search
newlines
Nikana Reklawyks
la source
la source
isearch-forward
)/This\_sis
. Pour plus de détails::help \_s
.Réponses:
Le GNU
grep
peut le fairePour répondre à certains points soulevés dans les commentaires, il y a quelques modifications au script:
En ce qui concerne les fichiers volumineux, je n'ai aucune imagination de limitation de mémoire, mais en cas de problème, vous êtes libre d'utiliser
sed
qui ne gardent pas plus de 4 lignes (car 4 mots dans le motif) en mémoire (
\(\n.*\)\{3\}
).la source
-z
option indiquegrep
de traiter les retours à la ligne comme des caractères de texte ordinaires et de rechercher des octets nuls pour séparer les enregistrements. Dans un fichier texte sans octets nuls (c'est-à-dire le cas typique),grep -z
traitera le fichier entier comme une seule ligne. Donc (1) cela soulève la question de savoir comment il peut gérer de gros fichiers, et (2) s'il trouve une correspondance, il écrira le fichier entier, sans donner d'indice quant à l'emplacement de la correspondance. Aussi (3) le PO a dit: «idéalement, traiter toute séquence d'espace blanc comme un seul espace», vous devez donc utiliser\s+
et ajouter-E
.-o
; J'oublie toujours ça. Une façon intelligente de l'utiliser. (1) Votre nouvellegrep
réponse commence^[\n]*
; c'est une faute de frappe pour[^\n]*
. (2) J'ai dit\s+
délibérément.be\s*little
correspondrabelittle
etcare\s*less
correspondracareless
. Mais je suppose que c'est un problème mineur. Et, si vous ne voulez pas utiliser-E
, vous pouvez utiliser « la version du pauvre » de\s+
, à savoir\s\s*
. (3) Bellesed
commande. Il peut échouer s'il y a des lignes vides (la phrase de quatre mots peut donc s'étaler sur plus de quatre lignes); J'ai pu résoudre ce problème en ajoutants/\n\s*\n/\n/
.-E
vous en acier en mesure d'utiliser+
en\s\+
forme. Les lignes vides à l'intérieur du motif semblent être artificielles.grep
des phrases.Essaye ça:
la source
\s
5 fois si je recherche "c'est un motif très long"?\s
correspond aux espaces, et la nouvelle ligne est un "espace".This\nis a very\nlong pattern
, et je ne sais pas où les sauts de ligne pourraient se produire. Je devrais chercherThis\sis\sa\svery\slong\spattern
, non? (qui devient fastidieux à mesure que la longueur du motif augmente ou est collée d'ailleurs)pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
.