Vim - як замінити один новий рядок \ n двома \ n


34

У редакторі 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

Це працює належним чином. Чи можете ви пояснити, чому це добре працює з другою командою?



2
FYI: Є також Vi і Vim (бета) SE .
Дубу

2
Бічна примітка, вам не потрібно використовувати /як роздільник. Це читабельніше::%s;\n;\n\n;g
DJMcMayhem

1
Пошук \n, замінити \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Антон Тарасенко

Відповіді:


47

Як не дивно, але \nvim для заміни означає не новий рядок, а нульовий. Нуль ASCII є ^@( control@).

Історично, vi замінює ^M( controlM) як закінчення рядка, що є новим рядком. vim додав розширення \r(на зразок мови C), щоб означати те саме, що ^M, але розробники вирішили зробити заміну\n нуля під час заміни тексту. Це суперечить його використанню в пошукових запитах , які знаходять новий рядок.

Подальше читання:


7

Спробуйте це: %s/$/^V^M/(де ^Vє Ctrl-Vі ^Mє Ctrl-M- коли ви введете, ^Vвін надрукує знак ^char, потім повернеться на нього назад, а тоді, коли ви будете вводити його, ^Mвін з'явиться як ^M... Ctrl-V - це стандартний tty буквальний наступний символ - запустіть команду stty -aдля покажіть спеціальні символи вашого tty).


Дійсно, дуже досвідчені будуть знати це для колись необхідного перетворення з CRLF як альтернативу відміненню та використанню dos2unix або подібного. Використання Ctrl-V - це урок 1-го дня.
mckenzm

5

vimвикористовувати \nдля представлення нульового символу \0в пам'яті, що як vimобробляти файл, містить нульовий символ (поки viне може).

Використання \nлише одного кінця рядка збігу в буфері, а не нового рядка в рядку при використанні в виразі.

Дивіться : h NL-used-for-Null та : h CR-used-for-NL для отримання більш детальної інформації.


1

Тестували з Neovim ( nvim) та Vimверсіями

NVIM v0.3.0
VIM - Vi IMproved 8.1

Видалити новий рядок:

cell
allele
rs2981578
fgfr2

Тут \nвідповідає новим рядкам ( проте для вставки нового рядка використовуйте \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Додати новий рядок:

Ні:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@є діакритичною позначкою для LF (стрічка каналу; див. http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )

Так:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Щоб вирішити питання ОП (як замінити одне \nна два, \n\n), просто додайте інше \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... тобто відповідає оригінальному новому рядку ( \n) і замініть його двома новими рядками / поверненнями каретки ( \r\r).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.