Как удалить пустые строки в нескольких диапазонах в Vim - PullRequest
2 голосов
/ 16 июня 2010

Я получаю текстовый файл:

<code><p>...</p>
<pre>
...

...
...
...

...

...

...


...
...

...

...

Обратите внимание: есть несколько пустых строк между [pre] ... [/ pre] .
Я хочу удалить их.
Но я хочу сохранить их в [p] ... [/ p]
Текстовый файл становится:

<code><p>...</p>
<pre>
...
...
...
...

...

...

...

    
...
...    
...

...

Я использую cmd ниже, чтобы найти их:

/<pre>\n\zs\_.\{-}\ze\n<\/pre>

Но я не знаю, что делать дальше!
Мне нужен однострочный cmd , чтобы сделать это.
Любая идея? Спасибо!
Чем проще, тем лучше!


Edit: Спасибо вам всем. Я просто выясняю, как это сделать с помощью моего другого вопроса
:g/<pre>/,/<\/pre>/s/^$\n//

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Эта строка удалит все пустые строки в <pre> блоках:

<code>:%s_<pre>\zs\_.\{-}\ze
_ \ = substitute (submatch (0), '\ n \ n \ @ =', '', 'g') _ g

WTF:

:%s_: запускает команду подстановки для всех строк в буфере. Вы можете использовать любой символ после s; использование того, который вы не используете в шаблоне (в данном случае _), означает, что вам не нужно избегать его в шаблоне.

\zs\_.\{-}\ze: минимальное многострочное совпадение всех символов в <pre> блоках.

_: отделяет строку соответствия от замены

\=: указание этого слова в начале замены означает, что замена является выражением vimscript, которое необходимо оценить.

substitute(submatch(0), '\n\n\@=', '', 'g'):

  • Выражение замены - это вызов функции substitute(...).
  • submatch(0): это дает полное внешнее совпадение, в данном случае все между \zs и \ze.
  • \n\n\@=: этот RE соответствует любой новой строке, за которой следует новая строка, фактически не продвигаясь после этой второй новой строки. Элемент \@= известен как «прогнозное утверждение нулевой ширины»; :help /\@ даст вам больше деталей.
  • Все остальное довольно просто, просто замените символ новой строки на все случаи жизни. Обратите внимание, что символ новой строки second (тот, что был обнаружен прогнозом) не считается частью совпадения и поэтому не заменяется (по крайней мере, до следующей итерации, когда он будет заменен за ним следует третий последовательный перевод строки).

Наконец, _g просто закрывает выражение флагом g, чтобы указать, что все экземпляры должны быть заменены. Я думаю, что мнемоника является «глобальной».

1 голос
/ 16 июня 2010

Ваша проблема очень похожа на проблему, выставленную там .

Иметь цикл (с поиском, который вызывается без "переноса") для поиска сначала открывающего тега, а затем закрывающего тега. Это определяет диапазон, к которому вы примените g/^\s*$/d_.

Может быть проще работать в обратном направлении, так как некоторые строки будут удалены.

РЕДАКТИРОВАТЬ: следующие однострочные, похоже, тоже работают

g/<pre>/,/<\/pre>/s/^\s*$\n//g
0 голосов
/ 16 июня 2010

:%s/^$\n// удалит все пустые строки из файла.

:%s/\(<pre>\)\(\n\|.\)*\(<\/pre>\)/\1\r\3/ удалит все внутри блоков.

Это не то, что вам нужно, но это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...