Почему \ ra newline для Vim?


255

Из вопроса Как заменить символ для новой строки в Vim? , Вы должны использовать \ r при замене текста на новую строку, как это

:%s/%/\r/g

Но при замене конца строки и новой строки для символа, вы можете сделать это следующим образом:

:%s/\n/%/g 

Какой раздел руководства документирует это поведение и каковы причины этого?


1
Для чего %нужен поиск и замена?
Qed

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

3
+ c24w Я думаю, он ссылается на «%» между косыми чертами, в первом примере «%» находится в месте поиска, а во втором примере - в месте замены, но @qed, чтобы ответить на ваш вопрос, эти «%» в буквальном смысле.
RastaJedi

Ответы:


156

Из vim docs по шаблонам :

\r соответствует <CR>

\n соответствует концу строки - при сопоставлении в строке вместо текста буфера сопоставляется буквенный символ новой строки.


41
Для меня смысл путаницы в том, что \ r и \ n означают разные вещи, когда используется шаблон поиска и шаблон замены.
Дламблин

3
@dlamblin Ага! Смотрите мой ответ :)
Ограниченное искупление

208

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

При поиске

...

\nперевод строки, \rесть CR(возврат каретки = Ctrl-M= ^M)

При замене

...

\rявляется новой строкой, \nявляется нулевым байтом ( 0x00).


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

114

Другим аспектом этого является то \0, что, как правило, NULL, s//\0/означает «весь подобранный образец». (Который, между прочим, избыточен с, и дольше, чем &).

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

-☈


1
Хорошая точка зрения! Так что это хак вокруг \ 0 - обратная ссылка на 0-ую вложенную группу - целое регулярное выражение. Это очень хороший ответ, но меня разочаровывает то, что я не могу использовать \ r вместо ... (имеется в виду: вставить # (13), например, в "нормальный" файл (== unix EOLs).
Томаш Гандор

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
underscore_d

Это, честно говоря, действительно отличное понимание того, почему \nв поиске и замене есть разные значения. Фантастический ответ.
ZeroKnight

47

:help NL-used-for-Nul

Техническая деталь:

<Nul>символы в файле хранятся как <NL>в памяти. На дисплее они отображаются как " ^@". Перевод сделан при чтении и записи файлов. Для сопоставления <Nul>с шаблоном поиска вы можете просто ввести CTRL- @ или " CTRL-V 000". Это, вероятно, именно то, что вы ожидаете. Внутренне символ заменяется на <NL>в шаблоне поиска. Что необычно, так это то, что при вводе CTRL-V CTRL-J также вставляет a <NL>, таким образом, также ищет a <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.