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

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

stuff here

J’essaie de faire une recherche et un remplacement de Vim pour me débarrasser de tous class="" et style="" mais j’ai du mal à faire en sorte que le match ne soit pas traité.

Ma première tentative était la suivante

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

mais Vim ne semble pas aimer le ? . Malheureusement retirer le ? rend le match trop gourmand.

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

Au lieu de .* Utiliser .\{-} .

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

Voir aussi :help non-greedy

La recherche non gourmande dans vim est effectuée à l’aide de l’opérateur {-}. Comme ça:

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

juste essayer:

 :help non-greedy 

Quel est le problème avec

 %s/style="[^"]*"//g 

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 les opérateurs de groupage et de cardinalité backwhacking (une exigence de syntaxe vim totalement contre-intuitive car vous ne faites pas correspondre les caractères littéraux mais en spécifiant 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 prêt à partir)

essayez de chercher / remplacer en utilisant

 :perldo s/// 

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

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

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 vim, utilisez un outil que vous connaissez déjà. Utiliser perl ferait le? modificateur travail pour désharmoniser le match.

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

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

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

G’day,

Le traitement de l’expression rationnelle de Vim n’est pas trop shiny. J’ai trouvé que la syntaxe de regexp pour sed correspondait parfaitement aux capacités de vim.

J’ai l’habitude de mettre la recherche en surbrillance (: définir hlsearch), puis de jouer avec l’expression rationnelle après avoir entré une barre oblique pour entrer en mode de recherche.

Edit: Mark, cette astuce pour minimiser les correspondances gourmandes est également abordée dans l’excellent livre de Dale Dougherty “Sed & Awk” ( lien Amazon assaini ).

Le chapitre trois “Comprendre la syntaxe de l’expression régulière” est une excellente introduction aux capacités d’expression rationnelle plus primitives impliquées dans sed et awk. Seulement une courte lecture et fortement recommandé.

HTH

à votre santé,