У меня есть файл с кучей пользовательских настроек по умолчанию. Я хочу изменить часть текста, но я с трудом придумываю совпадения и заменители. Используя следующий пример:
###############################################################################
# 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
Я хотел бы заменить # Trackpad: ...
наrunning "Trackpad: ..."
Решив проблему, я нашел кое-что, используя тестер регулярных выражений:
/\n\n#\s(.*)/g
Если я попытаюсь использовать это в Vim, это не сработает для меня:
:/\n\n#\s(.*)/running "\1"/g
Я думаю, моя проблема сводится к двум конкретным вопросам:
- Как я могу избежать поиска
\n
символов, и вместо этого убедиться, что#
не появляется в конце группы поиска? - Как я могу эффективно использовать группы захвата?
Ниже приведены отличные ответы. Трудно выбрать между всеми тремя, однако я считаю, что выбранный ответ является наиболее точным для моей первоначальной спецификации. Я рекомендую вам попробовать все три ответа с настоящим файлом, чтобы увидеть, как вы к ним относитесь.
источник
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(добавили «волшебный» флаг). Действительно трудно выбрать правильный ответ для моего первоначального вопроса, но я чувствую, что этот ответ наиболее близок к моему первоначальному ожидаемому ответу. Это также единственный файл, который работает по всему файлу без необходимости выбора диапазона.\r
вместо того,^M
чтобы получить новые строки?Я бы использовал что-то вроде:
^#
чтобы соответствовать#
символу, закрепленному в начале строки (это отвечает на вопрос 1)\s\+
соответствовать любому пробелу один или несколько раз\(
создать группу (это отвечает на вопрос 2).\{-}\
сопоставлять любой символ 0 или более раз не жадным способом ; это отличается от того,.*
что он пытается соответствовать как можно меньше, а не как можно больше. Попробуйте добавить:
символ в комментарии, чтобы понять, почему это важно\)
закончить подгруппу.:
соответствует буквальному:
Затем мы заменяем это текстом, который вы хотите, и используем
\1
для ссылки на захваченную нами группу.Синтаксис регулярных выражений немного похож на синтаксис вики: их много, они все на первый взгляд похожи, ни один из них явно не лучше, чем любой другой, но есть много различий.
Сегодня так называемые "Perl-совместимые" регулярные выражения являются де-факто по умолчанию в большинстве языков, но регулярные выражения Vim не совместимы с Perl-совместимыми выражениями! Синтаксис Vim regexp восходит, по крайней мере, к 70-м годам, когда Perl еще не было.
Вы можете увидеть это с подгруппами, где вы должны использовать,
\(
а не(
(это совместимо с «базовым» синтаксисом POSIX, но не с более распространенным «расширенным» синтаксисом POSIX или синтаксисом Perl). Вы можете контролировать это, добавляя\v
флаг в шаблон (см.:help /\v
Подробности), это сделает его «более совместимым», но не полностью (вам все равно придется использовать, например,.{-}
для не жадных совпадений)Таким образом, это может объяснить, почему использование «тестера регулярных выражений» почти, но не совсем, работает.
http://www.vimregex.com/ в качестве хорошего обзора / чит-листа Vim regexps.
источник
:
. Подробности смотрите в полном файле github.com/squarefrog/dotfiles/blob/master/osx/…Вы можете:
#
::/[^#]$/
#\s(.*)
в начале строки:s/\v^#\s(.*)/running "\1"/
Чтобы использовать группы, вам необходимо:
\(.*\)
или\v
:s/\v...
Сочетая это:
источник