Как заменить символ на новую строку в Vim?
Я пытаюсь заменить все , в текущем файле на новую строку:
:%s/,/n/g
но он вставляет то, что выглядит как ^@ вместо фактической строки. Файл не находится в режиме DOS или что-то еще.
Что делать?
Если вам интересно, как и мне, проверить вопрос почему r новая строка для Vim? как хорошо.
11 ответов:
использовать
\rвместо\n.подставляя на
\nвставить символ в текст. Чтобы получить новую строку, используйте\r. Когда поиск для новой строки вы все равно будете использовать\nоднако. Эта асимметрия обусловлена тем, что\nи\rделать немного разные вещи:
\nсоответствует концу строки (новая строка), тогда как\rсоответствует возврату каретки. С другой стороны, в замен\nвставить нулевой символ, тогда как\rвставляет новую строку (точнее, она рассматривается как вход). Вот небольшой, неинтерактивный пример, чтобы проиллюстрировать это, используя функцию командной строки Vim (другими словами, вы можете скопировать и вставить следующее в терминал, чтобы запустить его). xxdпоказывает шестнадцатеричный дамп результирующего файла.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.txtBefore: 0000000: 6261 720a bar. After: 0000000: 000a 720a ..r.другими словами,
\nвставил байт 0x00 в текст;\rвставил байт 0x0a.
вот хитрость:
во-первых, установите сеанс vi(m), чтобы разрешить сопоставление шаблонов со специальными символами (т. е.: новая строка). Вероятно, стоит поставить эту линию в свой .vimrc или .exrc файл.
:set magicдалее делать:
:s/,/,^M/gдля получения
^Mперсонаж, типа управления -v и нажмите введите. Под Windows, do управления - q,введите. Только так я могу помните, что это, помня, как мало смысла они делают:A:что было бы худшим управляющим символом для представления новой строки?
B:или
q(потому что это обычно означает "бросить") илиvпотому что это было бы так легко ввести управления -c по ошибке и убить редактора.A:сделать так.
синтаксис
s/foo/bar\rи\nиметь различные значения в зависимости от контекста.
коротко:
на
foo:
\Н = перевод строки (LF на Linux/Макинтош, возврата каретки и перевода строки в Windows)
\r = возврат каретки (CR)на
bar:
\r = это новая строка
\Н = нулевой байт.длиннее: (с номерами ascii)
NUL= 0x00 = 0 = CTRL@LF= 0x0A = 10 = CTRLJCR= 0x0D = 13 = CTRLMвот список символы управления ASCII вставить их в
vimчерез CTRLvCTRL---ключ---.
Вbashили другие оболочки unix / linux просто введите CTRL---ключ---. Попробуй CTRLM в bash, это то же самое, что удар введите, поскольку оболочка понимает, что имеется в виду, хотя системы linux используют линейные каналы для разграничения строк.чтобы вставить литерал в bash, добавляя их с CTRLv также будет работать.
попробуйте в Баш:
echo ^[[33;1mcolored.^[[0mnot colored.использует ANSI escape sequences, вставьте два
^[С помощью CTRLv ESC.вы также можете попробовать CTRLvCTRLmвведите, который даст вам это:
bash: $'\r': command not foundзапомнить
\rсверху? :>этой символы управления ASCII список отличается от полной таблица символов ASCII, в том, что контроль символы, которые вставляются в консоль / псевдотерминал / vim через CTRL ключ (ха-ха), можно найти там. В то время как в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих "символов".
если вы действительно хотите знать, откуда все это берется:http://www.linusakesson.net/programming/tty/.
Это лучшая ссылка, с которой вы столкнетесь в этой теме, но будьте осторожны: там будет драконы.
TL; DR
обычно
foo=\nиbar=\r.
от затмения
^Mсимволы могут быть встроены в линию, и вы хотите преобразовать их в строки.:s/\r/\r/g
но если нужно заменить, то следующая вещь работает
:%s/\n/\r\|\-\r/gВ приведенном выше примере каждая следующая строка заменяется следующей строкой, а затем | - и снова следующей строкой. Это используется в таблицах wiki. если текст выглядит следующим образом:
line1 line2 line3изменено на
line1 |- line2 |- line3
это лучший ответ на то, как я думаю, но было бы лучше в таблице:https://stackoverflow.com/a/12389839/962394.
так, перефразировав:
вы должны использовать
\rдля использования перевода строки (ascii0x0a, новая строка unix) в замене регулярных выражений, но это свойственно замене-обычно вы должны продолжать ожидать использования\nдля перевода строки и\rдля возврата каретки.это потому, что vim используется
\nв замене означает нулевой символ (ascii0x00). Вы могли бы ожидать, что ноль будет , освободив\nдля его обычного использования для линии подачи, ноуже имеет значение в заменах регулярных выражений, поэтому он был сдвинут на\n. Следовательно, затем идти дальше, чтобы сместить строку с\nдо\r(который в шаблоне регулярного выражения является символом возврата каретки, ascii0x0d).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".
Comments