Я пытаюсь заменить каждый ,
в текущем файле новой строкой:
:%s/,/\n/g
Но он вставляет то, что выглядит как ^@
вместо новой строки. Файл не в режиме DOS или что-то еще.
Что мне делать?
Если вам любопытно, как и мне, проверьте вопрос: почему \ V newline для Vim? также.
Ответы:
Используйте
\r
вместо\n
.Подстановка путем
\n
вставки нулевого символа в текст. Чтобы получить новую строку, используйте\r
. Однако при поиске новой строки вы все равно используете\n
. Эта асимметрия обусловлена тем, что\n
и\r
делают немного разные вещи :\n
соответствует концу строки (перевод строки), тогда как\r
соответствует возврату каретки. С другой стороны, в подстановках\n
вставляется нулевой символ, в то время как\r
вставляется символ новой строки (точнее, он обрабатывается как ввод <CR>). Вот небольшой, неинтерактивный пример, чтобы проиллюстрировать это, используя функцию командной строки Vim (другими словами, вы можете скопировать и вставить следующее в терминал, чтобы запустить его).xxd
показывает hexdump полученного файла.Другими словами,
\n
вставил байт 0x00 в текст;\r
вставил байт 0x0a.источник
\r
не работает так Но вы можете нажатьCtrl-V
Enter
вместо ввода\r
, и это работает.\r
вставляет<CR>
и\n
вставляет ноль, как бы я заменить что-то с возвратом каретки?Вот хитрость:
Во-первых, установите сеанс Vi (m), чтобы разрешить сопоставление с шаблоном со специальными символами (например, символом новой строки). Вероятно, стоит поместить эту строку в ваш файл .vimrc или .exrc:
Затем сделайте:
Чтобы получить
^M
персонажа, наберите Ctrl+ Vи нажмите Enter. В операционной системе Windows, сделайте Ctrl+ Q, Enter. Единственный способ запомнить это, помня, как мало они имеют смысла:источник
:set magic
(это не в моем ~ / _vimrc либо), ниctrl-q
. Простое,ctrl-v
за которым следует ввод, создает^M
для меня характер.Ctrl-C
на самом деле не убивает редактор, хотя он может отменить вас обратно в обычный режим.Ctrl-V
означает дословно иCtrl-Q
означает, что кто-то допустил ошибку при загрузке$VIMRUNTIME/mswin.vim
файла конфигурации. Тебе не нужен Мсвин. Просто используйте вместо этого свой собственный vimrc.sed -n l
до сих пор. Приятно знать, что того же можно достичь с помощьюCtrl-v
vim.В синтаксисе
s/foo/bar
,\r
и\n
имеют разные значения в зависимости от контекста.Короткий:
Для
foo
:\ n = перевод строки (LF в Linux / Mac, CR + LF в Windows)
\ r = возврат каретки (CR)
Для
bar
:\ r = перевод строки
\ n = нулевой байт.
Длиннее (с номерами ASCII):
NUL
= 0x00 = 0 = Ctrl+ @LF
= 0x0A = 10 = Ctrl+ JCR
= 0x0D = 13 = Ctrl+MВот список управляющих символов ASCII . Вставьте их в Vim через Ctrl+ V, Ctrl+ ---key---.
В Bash или других оболочках Unix / Linux просто введите Ctrl+ ---key---.
Попробуйте Ctrl+ Mв Bash. Это то же самое, что и удар Enter, поскольку оболочка понимает, что имеется в виду, хотя системы Linux используют перевод строки для разграничения строк.
Для вставки литералов в bash, добавление их к Ctrl+ Vтакже будет работать.
Попробуй в Bash:
Это использует escape-последовательности ANSI . Вставьте два
^[
«S с помощью Ctrl+ V, Esc.Вы также можете попробовать Ctrl+ V, Ctrl+ M, Enter, что даст вам:
Помните
\r
сверху? :>Этот список управляющих символов ASCII отличается от полной таблицы символов ASCII тем , что там Ctrlможно найти управляющие символы, которые вставляются в консоль / псевдотерминал / Vim с помощью ключа (ха-ха).
В то время как в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих «символов».
Если вы действительно хотите знать, откуда все это: TTY демистифицировано . Это лучшая ссылка, с которой вы столкнетесь по этой теме, но будьте осторожны: там будут драконы.
TL; DR
Обычно
foo
=\n
иbar
=\r
.источник
:s/x/^M/g
должен сделать. Вставьте^M
переход,ctrl-v
а затемctrl-m
.Вам необходимо использовать:
Чтобы получить
^M
символ, нажмите Ctrl+, vа затем Enter.источник
\r
может сделать работу здесь для вас.источник
С Vim на Windows используйте Ctrl+ Qвместо Ctrl+ V.
источник
Это лучший ответ на мой взгляд, но в таблице это было бы лучше:
Почему \ ra newline для Vim?
Итак, формулировка:
Вы должны использовать,
\r
чтобы использовать перевод строки (ASCII0x0A
, новая строка Unix) в замене регулярных выражений, но это характерно для замены - обычно вы должны продолжать использовать\n
для перевода строки и\r
возврата каретки.Это потому, что Vim используется
\n
в качестве замены для обозначения символа NIL (ASCII0x00
). Возможно, вы ожидали, что\0
вместо этого NIL освободится\n
для обычного использования для перевода строки, но\0
уже имеет значение в заменах регулярных выражений, поэтому он был перенесен на\n
. Следовательно, затем мы продолжаем также сдвигать новую строку с\n
на\r
(которая в шаблоне регулярного выражения является символом возврата каретки, ASCII0x0D
).NB:
^M
( Ctrl+ V Ctrl+ Mв Linux) вставляет новую строку при использовании в замене регулярного выражения, а не при возврате каретки, как советуют другие (я только что попробовал).Также обратите внимание, что Vim будет переводить символ перевода строки при сохранении в файл на основе своих настроек формата файла, и это может привести к путанице.
источник
Из затмения , что
^M
символы могут быть встроены в линию, и вы хотите , чтобы преобразовать их в символы новой строки.источник
Но если нужно заменить, то работает следующее:
Выше каждая следующая строка заменяется следующей строкой, а затем
|-
и снова новой строкой. Это используется в вики-таблицах.Если текст выглядит следующим образом:
Это изменено на
источник
Если вам нужно сделать это для всего файла, мне также предложили попробовать из командной строки:
источник
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
посмотреть, будет ли он работать в вашей системе. (Благодарю добрых людей из #bash на freenode за это предложение.)Вот ответ, который работал для меня. От этого парня:
---- цитирование Используйте редактор vi для вставки символа новой строки вместо
Что-то еще, что я должен сделать и не могу вспомнить, а затем должен искать.
В vi, чтобы вставить символ новой строки в поиск и заменить, выполните следующие действия:
Приведенная выше команда заменит все экземпляры «look_for» на «replace_with \ n» (с \ n означает перевод строки).
Чтобы получить «^ M», введите комбинацию клавиш Ctrl+ V, а затем (отпустите все клавиши) нажмите Enterклавишу.
источник