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 \v
wird 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 magic
Backslashes gesetzt werden müssen ).(
)
{
}
Wenn Sie alle diese Zeilen auf einmal sehen möchten, können Sie dies mit dem folgenden :g
Befehl kombinieren:
:g/\v(\|[^|]*){21,}/p
Übrigens, dieser Befehlstyp (aus demexVorgänger vonvi) ist der Ursprung des Namens des grep
Tools ( 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.