Mam plik z wieloma domyślnymi ustawieniami użytkownika. Chcę zmienić część tekstu, ale staram się wymyślić moduł dopasowujący i zamiennik. Korzystając z następującego przykładu:
###############################################################################
# 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
Chciałbym zamienić # Trackpad: ...
zrunning "Trackpad: ..."
Rozwiązując problem, wymyśliłem coś za pomocą testera wyrażeń regularnych:
/\n\n#\s(.*)/g
Jeśli spróbuję użyć tego w Vimie, to nie działa dla mnie:
:/\n\n#\s(.*)/running "\1"/g
Chyba mój problem sprowadza się do dwóch konkretnych pytań:
- Jak mogę uniknąć wyszukiwania
\n
znaków, a zamiast tego upewnić się,#
że nie pojawia się na końcu grupy wyszukiwania? - Jak mogę skutecznie korzystać z grup przechwytywania?
Poniżej znajduje się kilka świetnych odpowiedzi. Trudno wybrać między wszystkimi trzema, jednak uważam, że wybrana odpowiedź jest najdokładniejsza dla mojej oryginalnej specyfikacji. Zalecam wypróbowanie wszystkich trzech odpowiedzi z rzeczywistym plikiem, aby zobaczyć, co o nich myślisz.
źródło
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(dodał flagę „magia”). Naprawdę trudno jest wybrać prawidłową odpowiedź na moje pierwotne pytanie, ale czuję, że ta odpowiedź jest najbliższa mojej pierwotnej oczekiwanej odpowiedzi. Jest to również jedyny, który działa w całym pliku bez potrzeby wybierania zakresu.\r
zamiast^M
uzyskać nowe linie?Użyłbym czegoś takiego:
^#
dopasować#
znak zakotwiczony na początku linii (odpowiada to pytanie 1)\s\+
aby dopasować dowolne białe znaki jeden lub więcej razy\(
założyć grupę (odpowiada to pytanie 2).\{-}\
dopasowywać dowolny znak 0 lub więcej razy w sposób nie chciwy ; różni się.*
to tym, że stara się dopasować tak mało, jak to możliwe, a nie tak bardzo, jak to możliwe. Spróbuj dodać:
znak w komentarzu, aby zobaczyć, dlaczego to ma znaczenie\)
aby zakończyć podgrupę.:
pasuje dosłownie:
Następnie zamieniamy go na żądany tekst i używamy
\1
w odniesieniu do przechwyconej grupy.Składnia wyrażeń regularnych przypomina trochę składnię wiki: jest ich kilka, wszystkie wyglądają podobnie na pierwszy rzut oka, żadna z nich nie jest oczywiście lepsza niż jakakolwiek inna, ale istnieje wiele różnic.
Dzisiaj tak zwane wyrażenia regularne „kompatybilne z Perlem” są de facto domyślnymi ustawieniami w większości języków, ale wyrażenia regularne Vima nie są kompatybilne z wyrażeniami kompatybilnymi z Perlem! Składnia wyrażeń regularnych Vima sięga co najmniej lat 70-tych, kiedy Perla nawet nie było w pobliżu.
Możesz to zobaczyć w podgrupach, których musisz użyć,
\(
a nie(
(jest to zgodne ze „podstawową” składnią POSIX, ale nie z bardziej powszechną składnią „rozszerzoną” POSIX lub składnią Perl). Możesz to kontrolować, dodając\v
flagę do wzorca (zobacz:help /\v
szczegóły), dzięki temu będzie „bardziej kompatybilny”, ale nie do końca (musisz na przykład używać.{-}
do niepochodnych dopasowań)To może wyjaśniać, dlaczego używanie „testera wyrażeń regularnych” działa prawie, ale nie całkiem.
http://www.vimregex.com/ jako dobry przegląd / ściągawka Vim regexps.
źródło
:
. Zobacz pełną plik po szczegóły github.com/squarefrog/dotfiles/blob/master/osx/...Możesz:
#
::/[^#]$/
#\s(.*)
na początku wiersza:s/\v^#\s(.*)/running "\1"/
Aby korzystać z grup, musisz:
\(.*\)
lub\v
:s/\v...
Łącząc to:
źródło