Причина, по которой команда, указанная в формулировке вопроса, не работает как
его автор ожидает, что атом \@!
используется неправильно. Этот атом
соответствует (с нулевой шириной), если предшествует , а не следующий атом не
совпадение (см. :help /\@!
).
Таким образом, пересмотренная команда замещения должна быть
:%s/\\\@<!&\_$\@!/\\\&/g
Атом \_$
используется для соответствия конца строки вместо $
, так как
последний может быть использован для этой цели только в конце шаблона или непосредственно перед
\|
, \)
или \n
атомов (см. :help /$
и :help /\_$
).
Однако существует более простой способ выполнения замены после
одни и те же правила. Вместо сопоставления с амперсандом, за которым не следует конец строки,
можно просто сопоставить амперсанд, за которым следует любой не-символ новой строки:
:%s/\\\@<!&./\\&/g
В отличие от первой команды, &
, а не \&
используется в замене
строка, чтобы вставлялся не только один символ амперсанда, но и
весь сопоставленный текст (см. :help s/\&
).