Vim Substitution - PullRequest
       21

Vim Substitution

5 голосов
/ 07 марта 2012

Я всегда хотел знать, как можно подставить в заданные параметры.

Если у вас есть такая строка:

123,Hello,World,(I am, here), unknown

и вы хотите заменить World на Foobar, тогда это простая задача: :%s/World/Foobar/

Теперь мне интересно, как я могу избавиться от ,, который * ( ).

Теоретически мне просто нужно найти первое вхождение (, затем заменить , пробелом до ).

Ответы [ 5 ]

4 голосов
/ 07 марта 2012

Попробуйте заглянуть и посмотреть за утверждениями:

%s/([^)]*\zs,\ze.*)//

(\zs и \ze сообщают, где начинается и заканчивается шаблон)

или

%s/\(([^)]*\)\@<=,\(.*)\)\@=//

Первый является более читабельным, второй использует \( ... \) группировки с круглыми скобками внутри групп, что делает его похожим на запутанный, и \@<=, который, помимо того, что является хорошей уткой в ​​ASCII-искусстве, является оператором lookbehind и 1013 * это оператор прогнозирования.

Ссылки: :help pattern (более подробно: :help /\@=, :help /\ze и т. Д.)

Вы используете графический интерфейс и хотите попробовать эти команды? Скопируйте их в буфер обмена и запустите :@+ внутри Gvim.

2 голосов
/ 09 октября 2015

Небольшое изменение ответа @Tom может дать вам тихий добрый и "немного" более читаемый результат:

%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/

Таким образом, вы получите: в \1 будет храниться то, что вслева от круглых скобок, \4, что находится справа вне круглых скобок, и \2 и \3, что находится внутри скобок, соответственно слева (\2) и справа (\3).

С этим вы можете легко поменять свои элементы, если ваш файл организован в виде столбца.

1 голос
/ 07 марта 2012

Вы также можете выбрать текст, который хотите изменить (в режимах visual или visual-block), и ввести :, чтобы запустить команду замены.vi автоматически запустит команду с :'<,'>, который применяет команду к выбранной области.

Замена , может быть выполнена с:

:'<,'>s/,/ /g
0 голосов
/ 11 октября 2015

Еще один подход, основанный на том факте, что на самом деле вы хотите заменить только первое вхождение , внутри скобки:

:%s#\((.\{-}\),#\1 #

Пояснение:

  • :%s для подстановки во всем файле (не используйте %, если хотите работать только с текущей строкой)
  • мы можем использовать # или : в качестве разделителя, чтобы сделать команду более читабельной
  • в (.\{-} мы просим найти любой символ (точку) после левой круглой скобки, а остальные обозначают 0 или более вхождений (как можно меньше) этого символа. Это выражение помещено внутри \(...\), чтобы в будущем можно было ссылаться на эту группу как \1.
0 голосов
/ 07 марта 2012

Для вашего примера это то же самое, что предложено @ ubuntuguy

%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3

Это сделает именно ту замену, которую вы хотите.

...