Чому \ ra новий рядок для Vim?


253

З питання Як замінити символ на новий рядок у Vim? . Ви повинні використовувати \ r замінюючи текст для нового рядка, як це

:%s/%/\r/g

Але замінюючи кінець рядків та нові рядки для символу, ви можете це робити так:

:%s/\n/%/g 

Який розділ посібника документує ці поведінки та які міркування за ними?


1
Для чого %потрібен пошук та заміна?
qed

7
@qed: за замовчуванням :sбуде застосовано підстановку лише до поточного рядка. :%sзмушує адресувати весь файл. Більше .
c24w

3
+ c24w Я думаю, що він має на увазі "%" між косою рисою, перший приклад - "%" в пошуковому місці, а в другому прикладі - місце заміни, але @qed відповість на ваше запитання, ці "% Збігаються буквально.
RastaJedi

Відповіді:


154

З документів vim за шаблонами :

\r збіги <CR>

\n відповідає кінцевому рядку - при збігу в рядку замість тексту буфера узгоджується буквальний символ нового рядка.


41
Для мене справа плутанини полягає в тому, що \ r і \ n означають різні речі, коли вони використовуються - це схема пошуку та схема заміни.
dlamblin

3
@dlamblin Так! Дивіться мою відповідь :)
Обмежене спокутування

206

З http://vim.wikia.com/wiki/Search_and_replace :

Під час пошуку

...

\nє новим рядком, \rє CR(повернення каретки = Ctrl-M= ^M)

При заміні

...

\rє новим рядком, \nє нульовим байтом ( 0x00).


6
Ця відповідь мені найбільше допомогла. Також для отримання додаткової інформації :h :s%, особливо останнього абзацу. (через :h :s)
dipnlik

113

Інший аспект цього полягає в тому \0, що традиційно NULL прийнято s//\0/означати "весь узгоджений зразок". (Що, до речі, є зайвим і довше, ніж &).

  • Так що ви не можете використовувати, \0щоб означати NULL, так що ви використовуєте\n
  • Так що ви не можете використовувати, \nщоб означати \n, так що ви використовуєте \r.
  • Тож ви не \rможете сказати \r, але я не знаю, хто хотів би додати цю знаку спеціально.

—☈


1
Гарна думка! Отже, це хак навколо \ 0 - зворотній зв'язок до 0-ї вкладеної групи - цілий регулярний вираз. Це дуже хороша відповідь, але це робить мене розчарованим, що я не можу використовувати \ r в заміні ... (тобто: вставити # (13), наприклад, у "звичайний" файл (== unix EOL).
Томаш Гандор

3
Гаразд, відповідь - у документах Vim. Просто втечі \ ^ M або \ <CR>, із звичайним зворотним кутом. Приємно. ----- <CR> розділимо рядок у цій точці (Введіть <CR> як CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> вставити повернення каретки (CTRL-M) (Введіть <CR> як CTRL-V <Enter>) s / \ <CR>
Томаш Гандор

16
"Ще один аспект"? Ти занадто скромний! Пояснення точно_що чому це відбувається, дає чудову відповідь усім тим, хто просто говорить, як обійти це. +1
підкреслення_d

Це, чесно кажучи, справді чудово розуміє, чому \nв пошуку та заміні моделей є різні значення. Фантастична відповідь.
ZeroKnight

47

:help NL-used-for-Nul

Технічна деталь:

<Nul>символи у файлі зберігаються як <NL>у пам'яті. На дисплеї вони показані як " ^@". Переклад здійснюється під час читання та запису файлів. Для відповідності атрибуту<Nul> пошуку ви можете просто ввести CTRL- @ або " CTRL-V 000". Це, мабуть, саме те, чого ви очікуєте. Внутрішньо персонаж замінюється символом a <NL>в шаблоні пошуку. Що незвично, це те, що при введенні CTRL-V CTRL-J також вставляється a <NL>, таким чином, також здійснюється пошук <Nul> у файлі. {Vi взагалі не може обробляти <Nul>символи у файлі}



10

Перш за все, відкрийте, :h :sщоб переглянути розділ "4.2 Заміна" документації на "Змінити". Ось що команда приймає:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Зауважте опис про patternтаstring

Для {pattern}див |pattern|.
{string}може бути буквальним рядком або чимось
особливим; див |sub-replace-special|.

Отже, тепер ви знаєте, що модель пошуку та схема заміни відповідають різним правилам. Якщо ви перейдете за посиланням на |pattern|, ви перейдете до розділу, в якому пояснюються всі шаблони регулярних виразів, які використовуються у Vim.

Тим часом |sub-replace-special|перенесе вас до підрозділу "4.2 Заміна", який містить зразки заміщення, серед яких є \rрозрив / розрив лінії.

(Ярлик до цієї частини посібника є :h :s%)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.