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


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

:%s/,/\n/g 

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

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

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


1568


источник


Ответы:


использование \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.


2046



Вот трюк:

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

:set magic

Затем выполните:

:s/,/,^M/g

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

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

B: Или q(потому что это обычно означает «Выход») или vпотому что было бы так легко напечатать контроль - с по ошибке и убить редактора.

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


165



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


Для foo:
\ n = новая строка
\ r = CR (возврат каретки = Ctrl-M = ^ M)

Для bar:
\ r = - символ новой строки
\ n = нулевой байт (0x00).


Я часто встречал вопросы о таких вещах в прошлом, и когда-нибудь в будущем почти никто ничего не узнает об этом в конечном итоге ...

По «популярному» запросу:

Вот список Управляющие символы ASCII , вставьте их в vimс помощью CTRL v CTRL --- --- ключ ,
В bashили другие оболочки unix / linux просто введите CTRL --- --- ключ , Пытаться CTRL M в bash, то же самое, что и удар ВОЙТИ , поскольку оболочка понимает, что имеется в виду, хотя в Linux-системах используются линейные каналы для разграничения строк. Только контрольный символ для Line Feed CTRL-A, который связан с «переходом к началу строки» в bash.

Чтобы вставить литерал в bash, CTRL v также будет работать.

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

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

Это использует Управляющие последовательности ANSI , вставьте два ^[через CTRL v ESC ,

Вы также можете попробовать CTRL v CTRL м ВОЙТИ , который даст вам следующее:

bash: $'\r': command not found

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

Управляющие символы ASCII список отличается от стандартного таблица символов ascii , в котором управляющие символы, которые вставляются в консоль / псевдотерминал / vim через CTRL (haha), можно найти там. Если в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих «символов».

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


TL; DR

Как правило fooзнак равно \n, а также barзнак равно \r,


61



You need to use

:%s/,/^M/g

To get the ^M character, press Ctrl v followed by Enter


43



\r can do the work here for you.


27



With Vim on Windows use Ctrl+Q in place of Ctrl+V


20



From eclipse, the ^M characters can be embedded in a line, and you want to convert them to newlines.

:s/\r/\r/g

8



But if one has to substitute then following thing works

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

in the above every next line is substituted with next line and then |- and again a next line. This is used in wiki tables. if the text is as follows:

line1
line2
line3

is changed to

line1
|-
line2
|-
line3

5