Как заменить символ на новую строку в Vim?



Я пытаюсь заменить все , в текущем файле на новую строку:



:%s/,/n/g 


но он вставляет то, что выглядит как ^@ вместо фактической строки. Файл не находится в режиме DOS или что-то еще.



Что делать?



Если вам интересно, как и мне, проверить вопрос почему r новая строка для Vim? как хорошо.

1072   11  

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.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 и нажмите введите. Под 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 = CTRLJ
CR = 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.

вы должны использовать

:%s/,/^M/g

для получения ^M символ, нажмите Ctrlv следовал по введите

\r может сделать работу здесь для вас.

с Vim на Windows используйте Ctrl+ Q на месте Ctrl+V

от затмения ^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 в замене означает нулевой символ (ascii 0x00). Вы могли бы ожидать, что ноль будет , освободив \n для его обычного использования для линии подачи, но уже имеет значение в заменах регулярных выражений, поэтому он был сдвинут на \n. Следовательно, затем идти дальше, чтобы сместить строку с \n до \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".


Comments

    Ничего не найдено.