2014-01-14 3 views
1

Я хочу удалить пустые строки в файле в gvim для windows (а не vim из cygwin).

:g/^$/d # delete all blank lines correctly 
:%s/^$//g #can not delete all blank lines 

Это проблема, как выразить конец строки,
я проверил мой файл подробно с командой %!xxd,
я нашел есть 0d0a в конце каждой строки,
, когда конец строки выражается специальным символом $,
содержит 0d0a?
отличается от концепции the end of line betwwen command g и s?

:%s/^$\n//g #delete all blank lines correctly 

Это меня смутило, что ^$ будет содержать специальный символ \r\n или нет, в s команды может быть ^$ не содером особым характера \r\n, но ^$ в g команды сделать содер специального символа \r\n. какой положение особый знак $ пункт at? за \r\n или до \r\n.

ответ

7

Нет, две команды делают разные вещи. :g/^$/d говорит «найти пустые строки и удалить их», в то время как :s/^$//g означает «в этой (текущей) строке, замените все вхождения ничего в строке ничем (все еще на одной строке)». Последнее, как вы заметили, не имеет смысла.

EDIT для редактирования:

^$ не содержат ничего. Он буквально говорит «начало строки, а затем сразу конец строки», где «линия» обнаружена Vim. Vim знает, что \r\n или \r или \n (в зависимости от файла и на какой ОС он был создан, а также по параметрам Vim) отметьте конец строки и обработайте его соответствующим образом. Сепаратор лежит между^$.

Это как когда вы говорите «комнаты в моем доме» - это (для меня хотя бы) не включает стены. Когда вы говорите ^$\n, вы говорите «пустую комнату, а также деревянную стену рядом с ней». s/^$// «пустой (уже пустая) комната»; s/^$\n// «пустой пустую комнату и сломать ее стену».

Напротив, для g, ничего о нем ничего не говорится \n. Он находит пустую строку (не заботясь о каких-либо разделителях), а затем выполняет команду на ней; в вашем случае команда d: удалите строку. Он удаляет полную строку (наряду с любыми символами новой строки).Например, если вы пишете :g/DELETEME/d, он удалит любые строки, в которых есть DELETEME, где угодно: он не заботится о каких-либо новых строках в части соответствия, он просто удаляет совпадающие строки.

4

d означает удаление строк, которые соответствуют. s - замена. По существу второе выражение означает «подставлять строки, которые соответствуют ^$ с пустой строкой», но это не удаляет их. Вы ничего не заменяете ничем. ^ и $ являются утверждениями с нулевой шириной и не могут быть заменены.

+0

why ':% s/^ $ \ n // g' сделать tasd успешно? –

+0

@it_is_a_literature, потому что символ '\ n' является совпадающим символом, который заменяется. Google "утверждение нулевой ширины". –

+0

Почему:% s/^ $ \ r \ n // g не может работать? –

4

Оба препарата @Amadan и @Explosion Pills являются правильными, но я думаю, вам действительно нужно объяснение того, «как думает vim» о том, что вы редактируете.

Во-первых, vim основан на vi, который был интерфейсом для ex-редактора. Несмотря на то, что vim прошел долгий путь, он по-прежнему является линейным редактором . Не ищите волшебного персонажа в конце линии, потому что его нет! (Когда я говорю, что ВИМ проделал долгий путь, я помню, когда была добавлена ​​опция 'whichwrap'.)

Мы обычно не потрудились сделать различие, но файл на жестком диске отличается от буфер, который вы редактируете в vim (:help buffers). Файл представляет собой последовательность символов (или байтов). Когда vim читает файл, он разбивает их на строки в зависимости от опции 'fileformat' (короткая форма 'ff'). Поскольку вы работаете с окнами, по умолчанию 'ff'=dos, что означает, что 0d0a (a.k.a. CRLF или \r\n) в файле используется для разделения строк. У меня есть 'ff'=unix, поэтому я вижу только 0a, когда фильтрую через xxd. (До OS   X, Mac использовался 0d, поэтому было три стандарта!)

Хорошо, что волшебного символа EOL просто нет, потому что это делает vim портативным между системами. Являясь линейным редактором, vim позволяет делать всевозможные вещи, такие как поиск первого совпадения шаблонов на каждой строке и что-то делать с ним. Это не всегда то, что вы хотите, поэтому некоторые люди привыкли добавлять /g в конце каждой команды :s или даже устанавливать 'gdefault'.

Возвращаясь к исходному вопросу, удаление строки из буфера очень отличается от удаления всех символов в строке. Команды Ex (помните о линии) действуют в строках, а :d - это команда для ее удаления. Команда :s изменит линию; не следует путать общее использование :%s, которое вызывает :s на каждой строке в буфере (:help :range).

Смежные вопросы