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?
8 réponses
Au Lieu de .*
utiliser .\{-}
.
%s/style=".\{-}"//g
Voir Aussi :help non-greedy
La recherche non gourmande dans vim se fait à l'aide de l'opérateur { -}. Comme ceci:
%s/style=".\{-}"//g
Essayez simplement:
:help non-greedy
Si vous êtes plus à l'aise avec la syntaxe regex PCRE, qui
- prend en charge l'opérateur non gourmand ?, comme vous l'avez demandé dans OP; et
- 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
-
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>
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.
Avec \v
(comme suggéré dans plusieurs commentaires)
:%s/\v(style|class)\=".{-}"//g
Plugin eregex.vim gère les opérateurs Non gourmands de style Perl *?
et +?
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é,