web-dev-qa-db-de.com

Wie kann ich mein Match in vim nicht gierig machen?

Ich habe eine große HTML-Datei mit vielen Markups, die so aussehen:

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

Ich versuche, ein Vim-Suchen und -Ersetzen durchzuführen, um alle class="" Und style="" Zu entfernen, aber ich habe Probleme, das Streichholz ungleichmäßig zu machen.

Mein erster Versuch war dies

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

aber Vim scheint den ? nicht zu mögen. Leider macht das Entfernen des ? Das Match zu gierig.

Wie kann ich mein Streichholz ungreif machen?

464
Mark Biek

Anstatt .* verwenden .\{-}.

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

Siehe auch :help non-greedy

712
Randy Morris

Die nicht gierige Suche in vim erfolgt mit dem Operator {-}. So was:

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

versuch's einfach:

:help non-greedy
55
user80168

Was ist falsch mit

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

Wenn Sie sich mit PCRE-Regex-Syntax besser auskennen, welche

  1. unterstützt den nicht gierigen Operator ?, wie Sie im OP gefragt haben; und
  2. es sind keine Backwhacking-Gruppierungs- und Kardinalitätsoperatoren erforderlich (eine äußerst intuitive Syntaxanforderung für vim, da Sie keine Literalzeichen abgleichen, sondern Operatoren angeben). und
  3. wenn Sie [g] vim mit der Perl-Funktion kompiliert haben, testen Sie mit

    : Merkmale prüfen und überprüfen; Wenn + Perl da ist, kann es losgehen.

versuchen Sie es mit Suchen/Ersetzen

:perldo s///

Beispiel. Swap src und alt Attribute img Tag:

<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

Ich habe festgestellt, dass eine gute Lösung für diese Art von Frage ist:

:%! sed ... 

(oder Perl, wenn Sie bevorzugen). IOW, anstatt die regulären Ausdrücke von vim zu lernen, verwenden Sie ein Tool, das Sie bereits kennen. Mit Perl würde das? Modifikator-Arbeit, um das Match zu entgräten.

12
William Pursell

Mit \v (wie in mehreren Kommentaren vorgeschlagen)

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

Plugin eregex.vim behandelt nicht-gierige Perl-Operatoren *? und +?

1
bain