Я'пытаюсь заменить каждый ,
в текущем файле новой строкой:
:%s/,/\n/g
Но он вставляет то, что выглядит как ^@
вместо настоящей новой строки. Файл не находится в режиме DOS или что-то в этом роде.
Что мне делать?
Если вы любопытны, как и я, проверьте вопрос Почему \r - новая строка в Vim?.
\r
вместо \n
.Замена на \n
вставляет в текст нулевой символ. Чтобы получить новую строку, используйте \r
. Однако при поиске новой строки вы все равно будете использовать \n
. Эта асимметрия связана с тем, что \n
и \r
делают немного разные вещи:
\n
соответствует концу строки (newline), тогда как \r
соответствует возврату каретки. С другой стороны, в подстановках \n
вставляет нулевой символ, тогда как \r
вставляет новую строку (точнее, это рассматривается как ввод 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), чтобы разрешить сопоставление шаблона со специальными символами (т. Е. 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: Сделай так.
В синтаксисе 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, вставьте их в 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 / > Это лучшая ссылка, которую вы встретите по этой теме, но будьте осторожны: там будут драконы.
Обычно foo
= \ n
и bar
= \ r
.
Вам необходимо использовать
:%s/,/^M/g
Чтобы получить символ ^M
, нажмите Ctrl v, затем Enter
\r
может сделать эту работу за вас.
Это лучший ответ, как я думаю, но в таблице было бы лучше: 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 переведет символ канала строки, когда он сохраняет файл, основываясь на настройках формата файла, что может сбить с толку.
Из затмения символы ^ M
могут быть встроены в строку, и вы хотите преобразовать их в новые строки.
:s/\r/\r/g
Но если нужно заменить, то следующее работает
:%s/\n/\r\|\-\r/g
в приведенном выше случае каждая следующая строка заменяется следующей строкой, а затем | - и снова следующей строкой. Это используется в вики-таблицах. если текст следующий:
line1
line2
line3
изменено на
line1
|-
line2
|-
line3
Если вам нужно сделать для целого файла, мне также предложили попробовать из командной строки
sed 's/\\n/\n/g' file > newfile
Вот ответ, который работал на меня. От этого парня
Что-то еще, что я должен сделать и не могу вспомнить, а затем должен искать.
В vi, чтобы вставить символ новой строки в поиск и заменить, выполните следующие действия:
:% s / look_for / replace_with ^ M / g приведенная выше команда заменит все экземпляры «look_for» на «replace_with \ n» (с \ n, означающим newline)
чтобы получить «^ M», введите комбинацию клавиш «ctl-V», затем после этого (выпустите все клавиши) нажмите клавишу «enter».