Как заменить символ новой строкой в 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".