шаблон найден в поиске vim, а не в поиске vim и заменен? - PullRequest
7 голосов
/ 03 сентября 2011

В vim я пытаюсь выполнить операцию поиска и замены с использованием обратных ссылок и регулярных выражений. Интересно, что он распознает шаблон только в том случае, если я выполняю чистый поиск, но если я выполняю поиск и заменяю его, выдается ошибка E486: шаблон не найден.

У меня есть куча вызовов функций вида:

function( Nullable< double >(1.1), map[FOO] );

Где FOO - это имя переменной в каждой строке. Я хочу превратить это в

function( othermap[ FOO ], map[FOO] );

Если я попытаюсь

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g

Это дает мне "Ошибка шаблона не найдена". Даже

:%s/Null.*\(map[\)\(.*\)\]//g 

не будет работать, потому что он просто не распознает шаблон. Но если я попробую следующую команду с точно таким же регулярным выражением поиска:

/Null.*\(map[\)\(.*\)\]

Подсвечивается правильно. После чего я могу сделать% s // othermap [\ 2], \ 1 \ 2], чтобы выполнить замену. Так что я все-таки смог сделать свою замену, но я не могу понять, почему шаблон распознается в одном случае, а не в другом.

1 Ответ

9 голосов
/ 03 сентября 2011

Я могу воспроизвести результат, используя copy'n'paste из вашего вопроса на мою vim сессию. Однако подробное сообщение, которое я получаю:

E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g

Обратите внимание, что он потерял s/ в начале.

Однако, если присмотреться достаточно внимательно, проблема в том, что мы не спаслись [:

s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g
             ^
             |-- here; you need \[ to match the literal

Я не использую нотацию %; Я бы автоматически написал:

:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g

Это немного отличается от захвата. Также не было необходимости использовать обратную косую черту в \] в строке замены.

Однако эта команда также работает для меня:

:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g
...