web-dev-qa-db-fra.com

Comment puis-je rendre mon match non gourmand dans 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-remplacement de Vim pour me débarrasser de tous les class="" et style="" mais j'ai du mal à rendre le match désordonné.

Ma première tentative a été celle-ci

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

mais Vim ne semble pas aimer le ?. Malheureusement, supprimer le ? rend la correspondance trop gourmande.

Comment puis-je rendre mon match désagréable?

464
Mark Biek

Au lieu de .*, utilisez .\{-}.

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

Voir aussi :help non-greedy

712
Randy Morris

La recherche non gourmande dans vim s'effectue à l'aide de l'opérateur {-}. Comme ça:

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

essayez juste:

:help non-greedy
55
user80168

Quel est le problème avec

%s/style="[^"]*"//g
48
Paul Tomblin

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

  1. soutient l'opérateur non-cupide?, comme vous l'avez demandé dans OP; et
  2. ne nécessite pas d'opérateur de groupage et de cardinalité en arrière-plan (exigence de la syntaxe vim totalement contre-intuitive puisque vous ne faites pas correspondre les caractères littéraux mais spécifiez des opérateurs); et
  3. vous avez [g] vim compilé avec la fonctionnalité Perl, testez à l'aide de

    : ver et inspecter les caractéristiques; si + Perl est là, vous êtes prêt à partir)

essayez de rechercher/remplacer en utilisant

:perldo s///

Exemple. Échangez 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>
15
FrDarryl

J'ai trouvé qu'une bonne solution à ce type de question est la suivante:

:%! sed ... 

(ou Perl si vous préférez). IOW, plutôt que d'apprendre les particularités de Vim, utilisez un outil que vous connaissez déjà. Utiliser Perl ferait le? modificateur de travail pour désaccorder le match.

12
William Pursell

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

:%s/\v(style|class)\=".{-}"//g
2
JJoao

Le plugin eregex.vim gère les opérateurs non gourmands de style Perl *? et +?

1
bain