Замените & не в конце строки и не начинайте с \ with \ & в Vim - PullRequest
3 голосов
/ 02 ноября 2010

Мне нужно заменить & на \&, когда & не находится в конце строки и ему не предшествует \. Я могу успешно найти &, когда ему не предшествует \, но я не могу исключить те, которые находятся в конце строки.

line 1 &
line 2
line 3 another &
line 4 & is at the middle

В вышеприведенных четырех строках я хочу заменить & на \& в строке 4.

Как я мог это сделать?

Вот что я могу сделать до сих пор:

/\(\\\)\@<!&

Найти &, когда ему не предшествует \. Добавляя отрицательный прогноз \@!$, который использует:

/\(\\\)\@<!&\@!$

Я должен получить те &, которых нет в конце строки, но я не могу.

Ответы [ 2 ]

1 голос
/ 05 июня 2012

Причина, по которой команда, указанная в формулировке вопроса, не работает как его автор ожидает, что атом \@! используется неправильно. Этот атом соответствует (с нулевой шириной), если предшествует , а не следующий атом не совпадение (см. :help /\@!).

Таким образом, пересмотренная команда замещения должна быть

:%s/\\\@<!&\_$\@!/\\\&/g

Атом \_$ используется для соответствия конца строки вместо $, так как последний может быть использован для этой цели только в конце шаблона или непосредственно перед \|, \) или \n атомов (см. :help /$ и :help /\_$).

Однако существует более простой способ выполнения замены после одни и те же правила. Вместо сопоставления с амперсандом, за которым не следует конец строки, можно просто сопоставить амперсанд, за которым следует любой не-символ новой строки:

:%s/\\\@<!&./\\&/g

В отличие от первой команды, &, а не \& используется в замене строка, чтобы вставлялся не только один символ амперсанда, но и весь сопоставленный текст (см. :help s/\&).

1 голос
/ 02 ноября 2010

Примерно так?

:%s/\(.\|^\)&\(.\)/\1\\\&\2/g

Как правило, замените любой &, если он находится в начале строки или перед любым символом, за которым следует любой символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...