Question 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 se débarrasser de tout class="" et style="" mais j'ai du mal à rendre le match insupportable.

Ma première tentative était la suivante

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

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

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


418
2017-08-20 12:28


origine


Réponses:


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

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

Regarde aussi :help non-greedy


635
2017-08-20 12:45



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

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

essayez juste:

:help non-greedy

49
2017-08-20 12:45



Quel est le problème avec

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

42
2017-08-20 12:30



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

  1. prend en charge l'opérateur non gourmand, comme vous l'avez demandé dans OP; et
  2. n'exige 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 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
2017-11-20 15:23



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


10
2017-08-20 12:39



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

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

1
2017-09-29 11:25



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


1
2017-11-09 00:06



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.

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.

Modifier: Mark, cette astuce pour minimiser l'appariement gourmand est également abordée dans l'excellent livre de Dale Dougherty "Sed & Awk" (lien Amazon assaini).

Le Chapitre 3 "Comprendre la Syntaxe d'Expression Régulière" est une excellente introduction aux capacités d'expressions rationnelles plus primitives impliquées avec sed et awk. Seulement une courte lecture et fortement recommandé.

HTH

à votre santé,


-2
2017-08-20 12:42