Ich habe eine Datei mit einer Reihe von Benutzervorgaben. Ich möchte einen Teil des Texts ändern, habe aber Probleme, einen Matcher und einen Ersatz zu finden. Mit dem folgenden Beispiel:
###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input #
###############################################################################
# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
Ich möchte ersetzen # Trackpad: ...
mitrunning "Trackpad: ..."
Als ich das Problem aufschloss, kam ich mit einem Regex-Tester auf etwas:
/\n\n#\s(.*)/g
Wenn ich dies in Vim versuche und verwende, funktioniert es bei mir nicht:
:/\n\n#\s(.*)/running "\1"/g
Ich denke, mein Problem besteht aus zwei spezifischen Fragen:
- Wie kann ich vermeiden, nach
\n
Zeichen zu suchen , und stattdessen sicherstellen, dass#
sie nicht am Ende der Suchgruppe angezeigt werden? - Wie kann ich Erfassungsgruppen effektiv verwenden?
Im Folgenden finden Sie einige gute Antworten. Es ist schwierig, zwischen allen drei zu wählen, aber ich bin der Meinung, dass die gewählte Antwort für meine ursprüngliche Spezifikation am genauesten ist. Ich empfehle Ihnen, alle drei Antworten mit der aktuellen Datei zu versuchen, um zu sehen, wie Sie mit ihnen umgehen.
quelle
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(die "magische" Flagge hinzugefügt). Es ist wirklich schwierig, eine richtige Antwort für meine ursprüngliche Frage zu finden, aber ich bin der Meinung, dass diese Antwort meiner ursprünglich erwarteten Antwort am nächsten kommt. Es ist auch das einzige, das in der gesamten Datei funktioniert, ohne dass ein Bereich ausgewählt werden muss.\r
anstatt^M
neue Zeilen zu erhalten?Ich würde etwas verwenden wie:
^#
den#
am Zeilenanfang verankerten Buchstaben finden (dies beantwortet Frage 1)\s\+
um ein oder mehrere Leerzeichen zuzuordnen\(
eine Gruppe gründen (dies beantwortet Frage 2).\{-}\
ein beliebiges Zeichen 0-mal oder öfter auf nicht gierige Weise zu finden ; Dies unterscheidet sich darin,.*
dass es versucht, so wenig wie möglich und nicht so viel wie möglich zusammenzubringen. Versuchen Sie, ein:
Zeichen in den Kommentar einzufügen, um zu sehen, warum dies wichtig ist\)
um die Untergruppe zu beenden.:
Entspricht einem Literal:
Wir ersetzen dies dann durch den gewünschten Text und
\1
verweisen auf die Gruppe, die wir erfasst haben.Die Syntax für reguläre Ausdrücke ähnelt der Wiki-Syntax: Es gibt einige davon, alle sehen auf einen Blick gleich aus, keiner von ihnen ist offensichtlich besser als jeder andere, aber es gibt viele Unterschiede.
Heutzutage sind die sogenannten "Perl-kompatiblen" regulären Ausdrücke in den meisten Sprachen de facto die Standardeinstellung, aber reguläre Vim-Ausdrücke sind nicht mit Perl-kompatiblen Ausdrücken kompatibel! Die Syntax von Vim regexp geht mindestens auf die siebziger Jahre zurück, als Perl noch nicht einmal da war.
Sie können dies an den Untergruppen erkennen, die Sie verwenden müssen
\(
und nicht(
(dies ist mit der POSIX-Basissyntax kompatibel, jedoch nicht mit der allgemeineren POSIX-Extended-Syntax oder Perl-Syntax). Sie können dies steuern, indem Sie das\v
Flag in einem Muster hinzufügen (siehe:help /\v
Details). Dadurch wird es "kompatibler", aber nicht vollständig (Sie müssen es beispielsweise immer noch.{-}
für nicht gierige Matches verwenden).Dies könnte erklären, warum die Verwendung eines "Regex-Testers" fast, aber nicht ganz funktioniert.
http://www.vimregex.com/ als gute Übersicht / Spickzettel von Vim RegExps.
quelle
:
. Weitere Informationen finden Sie in der vollständigen Datei github.com/squarefrog/dotfiles/blob/master/osx/…Sie können:
#
::/[^#]$/
#\s(.*)
am Anfang der Zeile:s/\v^#\s(.*)/running "\1"/
Um Gruppen zu verwenden, müssen Sie entweder:
\(.*\)
oder\v
:s/\v...
Kombinieren Sie es:
quelle