Как заменить символ новой строки в Vim?
Я пытаюсь заменить все ,
в текущем файле на новую строку:
:%s/,/n/g
но он вставляет то, что выглядит как ^@
вместо фактической строки. Файл не находится в режиме DOS или что-то еще.
Что делать?
Если вам интересно, как и мне, проверить вопрос почему r новая строка для Vim? как хорошо.
11 ответов
использовать \r
вместо \n
.
подставляя на \n
вставляет в текст символ null. Чтобы получить новую строку, используйте \r
. Когда поиск на новую строку, нужно использовать \n
однако. Эта асимметрия обусловлена тем, что \n
и \r
делать немного разные вещи:
\n
соответствует концу строки (новая строка), тогда как \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), чтобы разрешить сопоставление шаблонов со специальными символами (т. е. новой строкой). Наверное, стоит вставить эту строчку в твою .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 = CTRLJCR
= 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
.
из 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".