Вопрос

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

:%s/,/\n/g 

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

Что мне следует делать?

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

Это было полезно?

Решение

Использование \r вместо того, чтобы \n.

Замена на \n вставляет нулевой символ в текст.Чтобы получить перевод строки, используйте \r.Когда поиск для перевода строки вы все равно будете использовать \n, однако.Эта асимметрия обусловлена тем, что \n и \r делайте немного другие вещи:

\n соответствует концу строки (переводу строки), тогда как \r соответствует возврату каретки.С другой стороны, при заменах \n вставляет нулевой символ, тогда как \r вставляет новую строку (точнее, она обрабатывается как входные данные <CR>).Вот небольшой, неинтерактивный пример, иллюстрирующий это, с использованием функции командной строки 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 выполните Контроль-q, Войти.Единственный способ, которым я могу запомнить их, - это вспомнить, как мало в них смысла:

A: Какой управляющий символ был бы наихудшим для представления новой строки?

B: Либо q (потому что обычно это означает "Бросить курить") или v потому что это было бы так легко напечатать Контроль-c по ошибке и убьет редактора.

A: Сделай это так.

В синтаксисе s/foo/bar \r и \n имеют разные значения, в зависимости от контекста.


короткий:

Для foo:
= перевод строки (LF в Linux/ mac, CRLF в Windows)
= возврат каретки (CR)

Для bar:
= является новой строкой
= нулевой байт.

дольше:(с номерами в формате 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 тоже будет работать.

Попробуйте в bash:

echo ^[[33;1mcolored.^[[0mnot colored.

Это использует Управляющие последовательности ANSI, вставьте два ^['s через CTRLvESC.

Вы также можете попробовать 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 символ, нажмите Ctrl v за которым следует Войти

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

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

Это лучший ответ на мой взгляд, но в таблице он был бы приятнее: https://stackoverflow.com/a/12389839/962394.

Итак, переформулируя:

Вам нужно использовать \r чтобы использовать перевод строки (ascii 0x0a, новая строка unix) при замене регулярного выражения, но это характерно для замены - обычно вы должны продолжать ожидать использования \n для перевода строки и \r для возврата каретки.

Это происходит потому, что vim использовал \n в замене означает нулевой символ (ascii 0x00).Вы могли бы ожидать, что NIL будет \0 вместо этого, освобождая \n для его обычного использования для перевода строки, но \0 уже имеет значение при замене регулярных выражений, поэтому оно было перенесено на \n.Следовательно, затем идем дальше, чтобы также перенести новую строку с \n Для \r (который в шаблоне регулярных выражений является символом возврата каретки, ascii 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

Примечание: ^M (Ctrl-V Ctrl-M в linux) вставляет новую строку при использовании при замене регулярного выражения, а не при возврате каретки, как советовали другие (я только что попробовал это).

Также обратите внимание, что vim преобразует символ перевода строки при сохранении в файл на основе своих настроек формата файла, и это может привести к путанице.

Из eclipse, the ^M символы могут быть встроены в строку, и вы хотите преобразовать их в новые строки.

:s/\r/\r/g

Но если кто-то должен заменить, то работает следующая вещь

:%s/\n/\r\|\-\r/g

в приведенном выше примере каждая следующая строка заменяется на next line, а затем |- и снова на next line .Это используется в таблицах wiki.если текст выглядит следующим образом:

line1
line2
line3

заменяется на

line1
|-
line2
|-
line3

Если вам нужно выполнить операцию для целого файла, мне также было предложено, чтобы вы могли попробовать из командной строки

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 ” (где означает перевод строки)

чтобы получить “^M”, введите комбинацию клавиш “ctl-V”, затем после этого (отпустите все клавиши) нажмите клавишу “enter”.


Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top