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

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

:%s/,/\n/g 

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

Что мне делать?

Если вы любопытны, как и я, проверьте вопрос Почему \r - новая строка в Vim?.

Комментарии к вопросу (3)
Решение

Используйте \r вместо \n.

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

\n соответствует концу строки (newline), тогда как \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.

Комментарии (16)

Вот трюк:

Сначала установите сеанс vi (m), чтобы разрешить сопоставление шаблона со специальными символами (т. Е. Newline). Вероятно, стоит поместить эту строку в файл .vimrc или .exrc.

:set magic

Далее сделай:

:s/,/,^M/g

Чтобы получить символ ^ M, введите Control < / kbd > - v < / kbd > и нажмите Enter < / kbd >. В Windows выполните Control < / kbd > - q < / kbd >, Enter < / kbd >. Единственный способ, которым я могу вспомнить это, вспомнив, как мало они имеют смысла:

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

B: Either q (потому что это обычно означает «Выход») или v, потому что было бы так легко ввести Control < / kbd > - c / kbd > по ошибке и убить редактор.

A: Сделай так.

Комментарии (5)

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


коротко:

Для foo: < br / > \ n = newline (LF на linux / mac, CRLF на окнах) < br / > \ r = возврат каретки (CR) < br / >

Для bar: < br / > \ r = это newline < br / > \ n = нулевой байт.& Лт; br / >

дольше: (с числами ascii)

< key > < / key > < > < / key > `NUL` = 0x00 = 0 = CTRL < / kbd > @ < / kbd > < br / > `LF` = 0x0A = 10 = CTRL < / kbd > J < / kbd > < br / > `CR` = 0x0D = 13 = CTRL < / kbd > M < / kbd >

Вот список контрольных символов ASCII, вставьте их в vim через CTRL < / kbd > / kbd > CTRL < / kbd > >.& Лт; br / > В bash или других оболочках unix / linux просто введите CTRL < / kbd > --- ключ --- < / kbd >. Попробуйте CTRL < / kbd > M < / kbd > в bash это то же самое, что и попадание / kbd >, поскольку оболочка понимает, что подразумевается, даже если системы linux используют линейные каналы для разграничения строк.

Чтобы вставить литералы в bash, дополнив их CTRL < / kbd > v < / kbd > также будет работать.

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

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

Это использует экранирующие последовательности ANSI, вставьте два ^ [ через CTRL < / kbd > / kbd > ESC < / kbd >.

Вы также можете попробовать CTRL < / kbd > / kbd > CTRL < / kbd > ; ; >

bash: $'\r': command not found

Помните \ r сверху? : >

Этот список контрольных символов ASCII отличается от полного списка символов ASCII тем, что управляющие символы вставляются в консоль / псевдотерминал / vim через CTRL < / kbd > ключ (хаха), можно найти там. Принимая во внимание, что в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих «символов».

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


  • TL; DR *

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

Комментарии (4)

Вам необходимо использовать

:%s/,/^M/g

Чтобы получить символ ^M, нажмите Ctrl v, затем Enter

Комментарии (1)

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

Комментарии (0)

С Vim в Windows используйте Ctrl < / kbd > + Q < / kbd > вместо / kbd > + / kbd >

Комментарии (0)

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

Итак, переформулировка:

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

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

& Лт; pre > символ | код ascii | C-представление | соответствие regex | замена regex ------------------------------ -------------- ------------------- + -------------- -------------------------- -------------------------- ---------- ------------------ ---------- ------------------ ------------------ ------------------ ---------- -- ------------------ ------------------ ------------------ ---------- ------------------ ---------- ---------- ------------------ ---------- ------------------ ---------- ------------------ -- ------------------ -- ------------------ -- -- -- -- ---------- ------------------ ---------- -- -- -- -- -- ------------------ ------------------ -- -- -- ---------- -- -- -- -- -- -- -- -- -- -- ------------------ -- -- -- -- -- ------------------ -- -- -- -- -- -- -- -- ---------- ---------- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ноль | 0x00 | \ 0 | \ 0 | \ nподача строки (unix newline) | 0x0a | \ n | \ n | \ r возврат каретки | 0x0d | \ r | \ r | & lt; unknown & gt ; & Лт; / pre >

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

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

Комментарии (0)

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

:s/\r/\r/g
Комментарии (0)

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

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

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

line1
line2
line3

изменено на

line1
|-
line2
|-
line3
Комментарии (0)

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

sed 's/\\n/\n/g' file > newfile
Комментарии (1)

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

---- цитирование 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, означающим newline)

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


Комментарии (0)