it-swarm-ru.tech

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

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

:%s/,/\n/g 

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

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

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

1775
Vinko Vrsalovic

Используйте \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.

2317
Konrad Rudolph

Вот хитрость:

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

:set magic

Затем сделайте:

:s/,/,^M/g

Чтобы получить символ ^M, введите Control-v и ударил Enter, Под виндой делай Control-qEnter, Единственный способ запомнить это, помня, как мало они имеют смысла:

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

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

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

184
Logan

В синтаксисе 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 = CTRLJ
CR = 0x0D = 13 = CTRLM

Вот список управляющих символов ASCII , вставьте их в vim через CTRLvCTRL---key---,.
В bash или других оболочках unix/linux просто введите CTRL---key---, Пытаться CTRLM в Баш, это так же, как удар ENTER, поскольку Shell понимает, что имеется в виду, несмотря на то, что системы Linux используют Line Feeds для разграничения строк.

Вставить литералы в bash, добавив к ним CTRLv тоже будет работать.

Попробуй в bash:

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

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

Вы также можете попробовать CTRLvCTRLmENTER, который даст вам это:

bash: $'\r': command not found

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

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

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


TL; DR

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

84
sjas

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

:%s/,/^M/g

Чтобы получить символ ^M, нажмите Ctrlv с последующим Enter

50
dogbane

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

33
Lasar

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

22
grantc

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

Итак, формулировка:

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

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

 персонаж | код ASCII | C представление | регулярное выражение | замена регулярных выражений 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 ноль | 0x00 |\0 |\0 |\n 
 перевод строки (новая строка unix) | 0x0a |\n |\n |\r 
 возврат каретки | 0x0d |\г |\г | <Неизвестно> 

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

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

10
codeshot

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

:s/\r/\r/g
10
rickfoosusa

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

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

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

line1
line2
line3

изменено на

line1
|-
line2
|-
line3
7
Kiran K Telukunta

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

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

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

---- цитирование 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".


4
user407749