2010-02-02 6 views
3

J'ai un document avec beaucoup de < swf ...> ..... </swf> dedans. Je voudrais supprimer tout cela. Utilisation de vi quand je tapeRegex rechercher et remplacer dans VI

:%s/\<swf[^\/swf>]+\/swf\>//g 

J'espérais que cela fonctionnerait, mais cela ne correspond à rien.

Répondre

8

Vous pouvez supprimer tous ceux du tampon avec cette commande:

:%s!<swf.\{-}/swf>!! 

si vous avez aussi des balises qui pourraient être divisés sur deux lignes, vous pouvez ajouter le modificateur \_ pour faire . match de retour à la ligne aussi:

:%s!<swf\_.\{-}/swf>!! 

ce supposant que vous souhaitez supprimer les balises et ce qu'ils contiennent, si vous voulez juste pour se débarrasser des étiquettes et de garder le contenu

:%s!</\?swf.\{-}>!! 

Notes:

  • vous n'avez pas besoin pour échapper < ou >
  • vous pouvez choisir ce modèle delimiter que vous souhaitez: Vim utilisera le premier caractère que vous mettez après la s dans la commande de substitution: cela enlève la nécessité d'échapper à des barres obliques dans votre modèle

EDIT: étendre ma réponse après votre commentaire

  • c'est exactement comme/STRING/REMPLACER/g J'utilisé seulement ! au lieu de / pour que je n'ai pas citer la barre oblique inverse dans le motif (voir mon deuxième point ci-dessus)
  • Je ne l'ai pas ajouter le modificateur g à la fin que j'ai :set gdefault dans mon .vimrc depuis toujours (cela signifie que, par défaut, Vim remplace tous les matchs en ligne au lieu de simplement la première, revenant ainsi le sens de /g)
  • \{-} est le " ungreedy "version du quantificateur *, ie il correspond à 0 ou plus de l'atome précédent mais prend aussi peu que possible e - Cela vous permet de vous assurer que votre motif de recherche s'étendra au premier "marqueur de fermeture" au lieu du dernier.

HTH

+0

Merci merci, qui fonctionne un régal !! Je suis curieux cependant, comment cela fonctionne sans utiliser le format/STRING/REPLACE/g? Et que signifie le {-}? – ktec

+0

Mise à jour ma réponse avec des détails sur votre commentaire –

+0

Awsome, merci beaucoup !! – ktec

3

Le problème ici est que la [] est une classe de caractères, de sorte que vous dites ce que, entre les balises d'ouverture et de fermeture swf, les lettres s, w et f ne peuvent pas apparaître nulle part, dans un ordre quelconque.

Vous pouvez essayer un match non gourmand à la place:

\<swf.\{-}\/swf\> 

Notez que . ne permet pas par défaut nouvelle ligne.

Je n'utilise pas Vim, donc j'ai utilisé ce guide pour découvrir la syntaxe. J'espère que c'est correct.

Questions connexes