7
votes

VIM: lors de la correspondance d'une chaîne sur plusieurs lignes à l'aide de \ _. Dans Regex, la commande: Yank ne fonctionne que pour la première ligne

Je veux extraire de multiples occurrences de certains textes qui couvre plusieurs lignes et peut être adaptée à une seule réégalité VIM (utilisation de META caractère \ _ ). Malheureusement, Althouth Les lignes correspondantes sont correctement soulignées dans Vim, Lorsque j'ajoute une commande Vim (comme Supprimer ou Yank) après la correspondance REGEXP, La commande ne fonctionne que sur la première ligne de chaque match.

Exemple: xxx

si j'exécute : g / bad_function ( [^;] \ + \ _ [^;] \ +; $ / d , alors seulement des lignes 1 et 7 sont supprimés bien que mis en surbrillance sont des lignes 1-4 et 7-9.

Comment yier / supprimer toutes les lignes assorties (en surbrillance)?


1 commentaires

3 Réponses :


0
votes

Comme déjà signalé dans mon commentaire; La question liée a la solution à votre problème: xxx pré>

fonctionne pour moi. p>

Si vous souhaitez correspondre à plusieurs termes sur différents lignes em> différents lignes, Vous pouvez essayer (en mode Command): P>

"zyy (do this on empty line to empty the register 'z')
:%g/first.*\|second.*/yank z (grab matches in the 'z' register)
P (for pasting the contents of the last register)


3 commentaires

Cela ne fonctionne toujours pas, seule la première ligne tirée. J'ai ajouté un exemple ci-dessus.


Mais s'il y a des lignes qui n'ont pas de motif spécifique entre la première et la deuxième ligne, comment pouvez-vous y avoir des chaussures?


@ Tombekeer: Je vois que vous avez modifié l'E.G. Publié dans votre question car ce n'était pas très clair avec la façon dont vous l'aviez formulée précédemment.



1
votes

Afin d'accumuler des gammes de lignes correspondantes dans un registre, on peut utiliser le Commande suivante.

:let @a='' | g/^first/,/^second/y A


2 commentaires

Si tel est le cas, pourquoi mon :% g / premier \ \ \ _. * Deuxièmement. * $ / '<<,'> Y travail?


@Chris Ça fonctionne parce que vous spécifiez explicitement la gamme de lignes à Yank (qui, à la manière, est égale à la plage de la correspondance uniquement avec coïncidence - voir mon commentaire à votre réponse).



6
votes

Essayez ceci:

:let @a=''
:g/first\_.*second.*$/normal! v/second^M$"Ay


3 commentaires

Cela semble un peu compliqué, pourquoi pas seulement :% g / premier. * \ | Deuxième. * / Yank z ?


parce que cela ne fera pas de lignes intermédiaires.


En effet; L'intention initiale de l'OP n'était pas très claire et je vois que la question est depuis modifiée pour être un peu plus claire.