6 votes

Comment extraire le texte correspondant à une regex en utilisant Vim ?

Je voudrais extraire quelques données d'un texte avec vim . les données sont de ce type :

72" title="(168,72)" onmouseover="posizione('(168,72)');" onmouseout="posizione('(-,-)');">>
72" title="(180,72)" onmouseover="posizione('(180,72)');" onmouseout="posizione('(-,-)');">>
72" title="(192,72)" onmouseover="posizione('(192,72)');" onmouseout="posizione('(-,-)');">>
72" title="(204,72)" onmouseover="posizione('(204,72)');" onmouseout="posizione('(-,-)');">>

Les données que je dois extraire sont contenues dans : title="(168,72)".
En particulier, je suis intéressé par l'extraction de ces seules coordonnées.

J'ai pensé à utiliser vim pour d'abord supprimer tout ce qui se trouve avant title=" mais je ne suis pas vraiment un gourou des regex donc je vous demande : si quelqu'un a un indice, dites-le moi :)

4voto

MrWednesday Points 409

Cela remplacera chaque ligne par une liste de coordonnées par ligne, délimitée par des tabulations :

:%s/.* title="(\(\d\+\),\(\d\+\))".*/\1\t\2

4voto

Magnun Leno Points 1175

Cette tâche peut être réalisée avec une solution beaucoup plus simple et avec peu de frappes en utilisant la commande normale :

:%normal df(f)D

Cela signifie :

  1. % - Exécuter la commande normale sur toutes les lignes du fichier ;
  2. normal - Exécutez les commandes suivantes en mode normal ;
  3. df( - supprimez tout jusqu'à ce que vous trouviez une parenthèse (parenthèse incluse) ;
  4. f) - déplacer le curseur sur ) ;
  5. D - supprime tout jusqu'à la fin de la ligne.

Vous pouvez également définir une plage, par exemple, exécuter cette opération de la ligne 5 à la ligne 10 :

:5,10normal df(f)D

3voto

Prince Goulash Points 7365

Si vous souhaitez une solution ad hoc pour ce cas unique, il peut être plus rapide de sélectionner simplement un bloc visuel en utilisant la fonction CTRL-v . Cela vous permettra de sélectionner une colonne arbitraire de texte (dans votre cas, la colonne contenant title="(X,Y)" ), qui peut ensuite être copié comme d'habitude en utilisant y .

0voto

Vous pouvez faire correspondre tout ce qui se trouve à l'intérieur de title=() et rejeter tout le reste comme ceci :

:%s,.*title="(\(.*\))".*,\1,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X