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

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

:%s/,/\n/g 

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

Что я должен делать?

Если вам любопытно, как и мне, проверьте вопрос: почему\V newline для Vim? также.

Ответ 1

Используйте \r вместо \n.

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

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

Ответ 2

Вот трюк:

Сначала установите сеанс vi (m), чтобы разрешить сопоставление шаблонов со специальными символами (например, новой линией). Вероятно, стоит поместить эту строку в ваш файл .vimrc или .exrc.

:set magic

Далее, do:

:s/,/,^M/g

Чтобы получить символ ^M, введите Control - v и нажмите Enter. В Windows сделайте Control - q, Enter. Единственный способ запомнить это - вспомнить, как мало смысла они делают:

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

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

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

Ответ 3

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


короткая:

Для foo:
\n = новая строка (LF в Linux/Mac, CRLF в Windows)
\r = возврат каретки (CR)

Для bar:
\r = перевод строки
\n = нулевой байт.

длиннее: (с номерами ascii)

NUL= 0x00 = 0 = CTRL @
LF= 0x0A = 10 = CTRL J
CR= 0x0D = 13 = CTRL M

Вот список управляющих символов ASCII, вставьте их в vim через CTRL v CTRL ---key---.
В bash или других оболочках Unix/Linux просто введите CTRL ---key---. Попробуйте CTRL M в bash, это то же самое, что нажать ENTER, так как оболочка понимает, что имеется в виду, даже если в системах Linux используется Line Feeds для разграничения строк.

Для вставки литерала в bash, добавление их с помощью CTRL v также будет работать.

Попробуй в bash:

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

При этом используются escape-последовательности ANSI, вставьте два ^[ через CTRL v ESC.

Вы также можете попробовать CTRL v CTRL m ENTER, что даст вам следующее:

bash: $'\r': command not found

Помните \r сверху? :>

Этот список управляющих символов ASCII отличается от полной таблицы символов ASCII тем, что там можно найти управляющие символы, которые вставляются в консоль/псевдотерминал /vim с помощью клавиши CTRL (ха-ха). В то время как в Си и большинстве других языков вы обычно используете восьмеричные коды для представления этих "символов".

Если вы действительно хотите знать, откуда все это происходит: http://www.linusakesson.net/programming/tty/.
Это лучшая ссылка, с которой вы столкнетесь по этой теме, но будьте осторожны: там будут драконы.


TL; DR

Обычно foo= \n, а bar= \r.

Ответ 4

Вам нужно использовать

:%s/,/^M/g

Чтобы получить символ ^M, нажмите Ctrl v, а затем Enter

Ответ 5

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

Ответ 6

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

Ответ 7

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

:s/\r/\r/g

Ответ 8

Это лучший ответ для того, как я думаю, но это было бы лучше в таблице: fooobar.com/questions/2697/....

Итак, переписывая:

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

Это потому, что vim использовал \n в замене для обозначения символа NIL (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>

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

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

Ответ 9

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

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

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

line1
line2
line3

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

line1
|-
line2
|-
line3

Ответ 10

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

sed 's/\\n/\n/g' file > newfile

Ответ 11

Вот ответ, который сработал у меня. От этого парня

---- quoting http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Что-то еще я должен делать и не могу вспомнить, а затем искать.

В vi для вставки символа новой строки в поиск и замену выполните следующие действия:

:% S/look_for/replace_with ^ М/г команда выше заменит все экземпляры "look_for" на "replace_with\n" (с\n значением новой строки)

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