Comment puis-je rendre mon match non gourmand en vim?

J'ai un gros fichier HTML qui a beaucoup de balisage qui ressemble à ceci:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

J'essaie de faire une recherche et un remplacement Vim pour me débarrasser de tous les class="" et style="" mais j'ai du mal à rendre le match ungreedy.

Ma première tentative était la suivante

%s/style=".*?"//g

, Mais Vim ne semble pas aimer le ?. Malheureusement, la suppression du ? rend le match trop gourmand.

Comment puis - je faire mon match ungreedy?

430
demandé sur Zombies 2009-08-20 16:28:17

8 réponses

Au Lieu de .* utiliser .\{-}.

%s/style=".\{-}"//g

Voir Aussi :help non-greedy

652
répondu Randy Morris 2009-08-20 12:45:49

La recherche non gourmande dans vim se fait à l'aide de l'opérateur { -}. Comme ceci:

%s/style=".\{-}"//g

Essayez simplement:

:help non-greedy
50
répondu Vilhelm Gray 2013-05-23 15:27:00

Quel est le problème avec

%s/style="[^"]*"//g
43
répondu Paul Tomblin 2009-08-20 12:30:22

Si vous êtes plus à l'aise avec la syntaxe regex PCRE, qui

  1. prend en charge l'opérateur non gourmand ?, comme vous l'avez demandé dans OP; et
  2. ne nécessite pas d'opérateurs de regroupement de backwhacking et de cardinalité (une exigence de syntaxe vim totalement contre-intuitive puisque vous ne correspondez pas aux caractères littéraux mais spécifiez des opérateurs); et
  3. Vous avez [g]vim compilé avec la fonctionnalité perl, test en utilisant

    : ver et inspecter les fonctionnalités; si + perl est là, vous êtes bon à aller)

Essayez de rechercher / remplacer en utilisant

:perldo s///

Exemple. Permuter les attributs src et alt dans la balise img:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>
14
répondu FrDarryl 2012-11-20 15:23:47

J'ai trouvé qu'une bonne solution à ce type de question Est:

:%!sed ...

(ou perl si vous préférez). IOW, plutôt que d'apprendre les particularités de regex de vim, utilisez un outil que vous connaissez déjà. L'utilisation de perl ferait le ? modificateur travail à ungreedy le match.

10
répondu William Pursell 2009-08-20 12:39:45

Avec \v (comme suggéré dans plusieurs commentaires)

:%s/\v(style|class)\=".{-}"//g
1
répondu JJoao 2015-09-29 11:25:50

Plugin eregex.vim gère les opérateurs Non gourmands de style Perl *? et +?

1
répondu bain 2016-11-09 00:06:39

G'Day,

Le traitement de l'expression rationnelle de Vim n'est pas trop brillant. J'ai trouvé que la syntaxe regexp pour sed est à propos de la bonne correspondance pour les capacités de vim.

Je règle généralement la mise en surbrillance de la recherche sur (: set hlsearch), puis joue avec l'expression rationnelle après avoir entré une barre oblique pour entrer en mode de recherche.

Edit: Mark, cette astuce pour minimiser la correspondance Gourmande est également couverte dans L'excellent Livre de Dale Dougherty "Sed & Awk" (sanitised Amazon link).

Chapitre Trois "comprendre la syntaxe des expressions régulières" est une excellente introduction aux capacités d'expression rationnelle plus primitives impliquées avec sed et awk. Seulement une courte lecture et fortement recommandé.

HTH

Santé,

-2
répondu Rob Wells 2009-08-20 12:50:19