Дополнительно
Как заменить символ на новую строку в Vim
Я'пытаюсь заменить каждый ,
в текущем файле новой строкой:
:%s/,/\n/g
Но он вставляет то, что выглядит как ^@
вместо настоящей новой строки. Файл не находится в режиме DOS или что-то в этом роде.
Что мне делать?
Если вы любопытны, как и я, проверьте вопрос Почему \r - новая строка в Vim?.
1859
11
Используйте
\r
вместо\n
.Замена на
\n
вставляет в текст нулевой символ. Чтобы получить новую строку, используйте\r
. Однако при поиске новой строки вы все равно будете использовать\n
. Эта асимметрия связана с тем, что\n
и\r
делают немного разные вещи:\n
соответствует концу строки (newline), тогда как\r
соответствует возврату каретки. С другой стороны, в подстановках\n
вставляет нулевой символ, тогда как\r
вставляет новую строку (точнее, это рассматривается как ввод ). Вот небольшой неинтерактивный пример, иллюстрирующий это, с использованием функции командной строки Vim (другими словами, вы можете скопировать и вставить следующее в терминал, чтобы запустить его).xxd
показывает hexdump полученного файла.Другими словами,
\n
вставил в текст байт 0x00;\r
вставил байт 0x0a.Вот трюк:
Сначала установите сеанс vi (m), чтобы разрешить сопоставление шаблона со специальными символами (т. Е. Newline). Вероятно, стоит поместить эту строку в файл .vimrc или .exrc.
Далее сделай:
Чтобы получить символ
^ M
, введите Control < / kbd > - v < / kbd > и нажмите Enter < / kbd >. В Windows выполните Control < / kbd > - q < / kbd >, Enter < / kbd >. Единственный способ, которым я могу вспомнить это, вспомнив, как мало они имеют смысла:В синтаксисе
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:
Это использует экранирующие последовательности ANSI, вставьте два
^ [
через CTRL < / kbd > / kbd > ESC < / kbd >.Вы также можете попробовать CTRL < / kbd > / kbd > CTRL < / kbd > ; ; >
Помните
\ r
сверху? : >Этот список контрольных символов ASCII отличается от полного списка символов ASCII тем, что управляющие символы вставляются в консоль / псевдотерминал / vim через CTRL < / kbd > ключ (хаха), можно найти там. Принимая во внимание, что в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих «символов».
Если вы действительно хотите знать, откуда все это: http://www.linusakesson.net/programming/tty/. & Лт; br / > Это лучшая ссылка, которую вы встретите по этой теме, но будьте осторожны: там будут драконы.
Обычно
foo
=\ n
иbar
=\ r
.Вам необходимо использовать
Чтобы получить символ
^M
, нажмите Ctrl v, затем Enter\r
может сделать эту работу за вас.С Vim в Windows используйте Ctrl < / kbd > + Q < / kbd > вместо / kbd > + / kbd >
Это лучший ответ, как я думаю, но в таблице было бы лучше: https://stackoverflow.com/a/12389839/962394.
Итак, переформулировка:
Вам нужно использовать
\ r
, чтобы использовать линейный канал (ascii0x0a
, unix newline) в замене regex, но это свойственно замене - обычно следует продолжать ожидать использования\ n
для линии подача и\ r
для возврата каретки.Это связано с тем, что vim использовал
\ n
в замене для обозначения символа NIL (ascii0x00
). Возможно, вы ожидали, что вместо этого NIL будет\ 0
, освобождая\ n
для обычного использования в линейном фиде, но\ 0
уже имеет значение в заменах регекса, поэтому он был перемещен в\ n
. Следовательно, затем идти дальше, чтобы также переместить новую строку из\ n
в\ r
(который в шаблоне ergex является символом возврата каретки, ascii0x0d
).& Лт; 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 переведет символ канала строки, когда он сохраняет файл, основываясь на настройках формата файла, что может сбить с толку.
Из затмения символы
^ M
могут быть встроены в строку, и вы хотите преобразовать их в новые строки.Но если нужно заменить, то следующее работает
в приведенном выше случае каждая следующая строка заменяется следующей строкой, а затем | - и снова следующей строкой. Это используется в вики-таблицах. если текст следующий:
изменено на
Если вам нужно сделать для целого файла, мне также предложили попробовать из командной строки
Вот ответ, который работал на меня. От этого парня
---- цитирование 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».