В редакторе vim я хочу заменить символ новой строки (\ n) двумя символами новой строки (\ n \ n) в командном режиме vim.
Содержание входного файла:
This is my first line.
This is second line.
Команда, которую я попробовал:
:%s/\n/\n\n/g
он заменяет строку нежелательными символами как
This is my first line.^@^@This is second line.^@^@
Затем я попробовал следующую команду
:%s/\n/\r\r/g
Это работает правильно. Можете ли вы объяснить, почему он работает нормально со второй командой?
vim
regular-expression
vi-mode
Raghvendra
источник
источник
/
в качестве разделителя. Это более читабельно::%s;\n;\n\n;g
\n
, заменить\r\r
,:% s/\n/\r\r/g
: stackoverflow.com/a/71334/911945Ответы:
Как ни странно,
\n
в vim для замены подразумевается не перевод строки, а null. ASCII nul is^@
( control@).Исторически vi заменяет
^M
( controlM) как конец строки, то есть перевод строки. vim добавил расширение\r
(например, язык C), чтобы оно означало то же, что и^M
, но разработчики решили сделать\n
значение NULL при замене текста. Это несовместимо с его использованием в поисках , которые находят новую строку.Дальнейшее чтение:
источник
Попробуйте это:
%s/$/^V^M/
(где^V
естьCtrl-V
и^M
естьCtrl-M
- когда вы набираете,^V
он печатает^
символ, затем возвращается на него, а затем, когда вы набираете,^M
он будет выглядеть как^M
... Ctrl-V - это стандартный следующий буквенный символ tty - выполните командуstty -a
для показать специальные символы вашего tty).источник
vim
использовать\n
для представления нулевого символа\0
в памяти, чтобыvim
файл дескриптора содержал нулевой символ (покаvi
не может).Использование
\n
только совпадения конца строки в буфере, а не перевода строки в строке при использовании в выражении.Смотрите : h NL-used-for-Null и : h CR-used-for-NL для получения более подробной информации.
источник
Протестировано с Neovim (
nvim
) иVim
версиямиУдалить новую строку:
Здесь
\n
совпадает с символами новой строки ( однако для вставки символа новой строки используйте\r
):Добавить новую строку:
Нет:
^@
является диакритическим знаком для LF (перевод строки; см. http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )Да:
Чтобы ответить на вопрос ОП (как заменить один
\n
на два\n\n
), просто добавьте другой\r
:... т.е. соответствует исходной функции новой строки (
\n
) и заменяет ее двумя символами новой строки / возврата каретки (\r\r
).источник