Wie finde ich mit Vim alle Zeilen mit mehr als N Vorkommen eines Zeichens

Wie finde ich mit Vim alle Zeilen mit mehr als N Vorkommen eines Zeichens

Ich versuche, alle Zeilen in einer Datei zu finden, in denen das |(Pipe-)Zeichen mehr als 21 Mal vorkommt. Das |Zeichen ist ein Feldtrennzeichen, daher gibt es keine bestimmte Anzahl von Zeichen, die zwischen |den Instanzen vorkommen können. Gibt es eine einfache Möglichkeit, dies in Vim zu tun?

HINWEIS: Ich verwende gVim auf einem Windows-Computer, daher kann ich keine *nix-spezifischen Tricks verwenden.

TIA

Antwort1

Sie können einen regulären Ausdruck verwenden, um solche Zeilen mit der normalen Suchfunktion zu finden:

/\v(\|[^|]*){21,}

Dadurch \vwird sichergestellt, dass der reguläre Ausdruck unabhängig vom Wert der Option funktioniert (es macht alle nicht alphanumerischen Zeichen (außer dem Unterstrich) zu Sonderzeichen; ich verwende es hier auch, um zu vermeiden, dass vor , , , und magicBackslashes gesetzt werden müssen ).(){}

Wenn Sie alle diese Zeilen auf einmal sehen möchten, können Sie dies mit dem folgenden :gBefehl kombinieren:

:g/\v(\|[^|]*){21,}/p

Übrigens, dieser Befehlstyp (aus demexVorgänger vonvi) ist der Ursprung des Namens des grepTools ( g/re/p:re, Abkürzung für regexp).


Wenn Ihre Quelldaten „durch Pipe-Zeichen getrennt“ sind, sollten Sie wahrscheinlich prüfen, ob in einem der Werte Pipe-Zeichen eingebettet sind (möglicherweise durch Escape-Zeichen (z. B. mit vorangestelltem Backslash), Verdoppelung oder Anführungszeichen). Die obige Regexp-Methode kann erweitert werden, um die meisten Escape- und Verdoppelungsmethoden abzudecken, aber das Parsen von Werten in Anführungszeichen erfordert normalerweise mehr Ausdruckskraft, als die meisten Regexp-Sprachen bieten können.

verwandte Informationen