Как заменить символ новой строки в Vim?

Я пытаюсь заменить все , в текущем файле на новую строку:

:%s/,/n/g 

но он вставляет то, что выглядит как ^@ вместо фактической строки. Файл не находится в режиме DOS или что-то еще.

Что делать?

Если вам интересно, как и мне, проверить вопрос почему r новая строка для Vim? как хорошо.

11 ответов


использовать \r вместо \n.

подставляя на \n вставляет в текст символ null. Чтобы получить новую строку, используйте \r. Когда поиск на новую строку, нужно использовать \n однако. Эта асимметрия обусловлена тем, что \n и \r делать немного разные вещи:

\n соответствует концу строки (новая строка), тогда как \r соответствует возврату каретки. С другой стороны, в замен \n вставить нулевой символ, тогда как \r вставляет новую строку (точнее, она рассматривается как вход ). Вот небольшой, неинтерактивный пример, чтобы проиллюстрировать это, используя функцию командной строки Vim (другими словами, вы можете скопировать и вставить следующее в терминал для его запуска). xxd показывает hexdump результирующего файла.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

другими словами, \n вставил байт 0x00 в текст;\r вставил байт 0x0a.


вот трюк:

во-первых, установите сеанс vi(m), чтобы разрешить сопоставление шаблонов со специальными символами (т. е. новой строкой). Наверное, стоит вставить эту строчку в твою .vimrc или .exrc файл.

:set magic

далее делать:

:s/,/,^M/g

для получения ^M персонаж, типа управления-v и нажмите Enter. Под Windows, do управления- q, Enter. Только так я могу запомните это, помня, как мало смысла они имеют:

A:что было бы худшим контрольным символом для представления новой строки?

B:или q (потому что это обычно означает "бросить") или v потому что это было бы так легко ввести управления-c по ошибке и убить редактора.

A:сделать так.


синтаксис s/foo/bar \r и \n иметь различные значения в зависимости от контекста.


коротко:

на foo:
\n = новая строка (LF в linux/mac, CRLF в windows)
\r = возврат каретки (CR)

на bar:
\r = is newline
\Н = нулевой байт.

длиннее: (с номерами ascii)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

вот список символы управления ASCII вставить их в vim via CTRLvCTRL---ключ---.
В bash или другие оболочки unix / linux просто введите CTRL---ключ---. Попробуй!--36-->CTRLM в Баш, это то же самое, что удар ENTER, поскольку оболочка понимает, что это означает, хотя системы linux используют каналы строк для разграничения строк.

чтобы вставить литерал в bash, добавляя их с CTRLv также будет работать.

попробуйте в bash:

echo ^[[33;1mcolored.^[[0mnot colored.

использует ANSI escape-последовательности, вставьте два ^[ ' s via CTRLvESC.

вы также можете попробовать CTRLvCTRLm ENTER, который даст вам это:

bash: $'\r': command not found

запомнить \r сверху? :>

этой символы управления ASCII список отличается от полной таблица символов ASCII, в том, что контроль символы, которые вставляются в консоль / псевдотерминал / vim через CTRL ключ (ха-ха), можно найти там. В то время как в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих "символов".

если вы действительно хотите знать, откуда все это берется:http://www.linusakesson.net/programming/tty/.
Это лучшая ссылка, с которой вы столкнетесь по этой теме, но будьте осторожны: драконы.


TL; DR

обычно foo = \n и bar = \r.


вам нужно использовать

:%s/,/^M/g

для получения ^M символ, нажмите Ctrl v следовал по Enter


\r может сделать работу здесь для вас.


с Vim на Windows используйте Ctrl+Q на месте Ctrl+V


из eclipse,^M символы могут быть встроены в линию, и вы хотите преобразовать их в строки.

:s/\r/\r/g

но если нужно заменить, то следующая вещь работает

:%s/\n/\r\|\-\r/g

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

line1
line2
line3

изменено на

line1
|-
line2
|-
line3

это лучший ответ для того, как я думаю, но было бы лучше в таблице:https://stackoverflow.com/a/12389839/962394.

так, перефразировав:

вам нужно использовать \r использовать ленту (ascii 0x0a, новая строка unix) в замене регулярного выражения, но это свойственно замене-обычно вы должны продолжать ожидать использования \n для линии питания и \r для возврата каретки.

это потому, что vim используется \n в замене означает символ NIL (ascii 0x00). Вы могли бы ожидать, что NIL будет , освободив \n для его обычного использования для линии подачи, но уже имеет значение в заменах регулярных выражений, поэтому он был смещен на \n. Следовательно, идя дальше, также сдвиньте новую строку с \n to \r (который в шаблоне регулярного выражения является символом возврата каретки, ascii 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       |                |           | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB:^M (Ctrl-V Ctrl - M на linux) вставляет новую строку при использовании в замене регулярного выражения, а не возврата каретки, как советовали другие (я только что попробовал).

также обратите внимание, что vim будет переводить символ строки, когда он сохраняет в файл на основе его настроек формата файла, и это может запутать вопросы.


Если вам нужно сделать файл, также подсказал, что можно попробовать из командной строки

sed 's/\n/\n/g' file > newfile

вот ответ, который работал для меня. От этого парня

----цитирование http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Что-то еще я должен сделать и не могу вспомнить, а затем должен посмотреть вверх.

в vi чтобы вставить символ новой строки в поиск и заменить, выполните следующие действия:

:%s/look_for / replace_with^M / g команда выше заменит все экземпляры "look_for" с " replace_with\n "(с \N означает новую строку)

чтобы получить "^M", введите комбинацию клавиш "ctl-V", затем после этого (отпустите все клавиши) нажмите клавишу" enter".