Как удалить текст в файле на основе регулярного выражения с помощью vim - PullRequest
2 голосов
/ 07 августа 2010

У меня есть XML-файл, подобный этому:

<fruit><apple>100</apple><banana>200</banana></fruit>
<fruit><apple>150</apple><banana>250</banana></fruit>

Теперь я хочу удалить весь текст в файле, кроме слов в теге apple. То есть файл должен содержать:

100
150

Как мне этого добиться?

Ответы [ 3 ]

5 голосов
/ 07 августа 2010
:%s/.*apple>\(.*\)<\/apple.*/\1/

Это должно делать то, что вам нужно. Работал на меня.

По сути, просто захватывает все, вплоть до тега, включая обратную ссылку, а затем возвращает все ссылки между начальным и конечным тегами яблока и соответствует остальной части строки. Заменяет его на первую обратную ссылку, которая была между тегами яблок.

0 голосов
/ 01 марта 2012

В этом случае можно использовать общую технику для сбора совпадений объяснил мой ответ на вопрос " Как извлечь совпадения с регулярным выражением используя Vim".

Чтобы собрать и сохранить все совпадения в списке, выполните команду Ex

:let t=[] | %s/<apple>\(.\{-}\)<\/apple>\zs/\=add(t,submatch(1))[1:0]/g

Команда намеренно не изменяет содержимое буфера, а только собирает согласованный текст. Чтобы установить содержимое текущего буфера в разделенный символом новой строки список совпадений, используйте команду

:0pu=t | +,$d_
0 голосов
/ 29 февраля 2012

Я лично использую это:

%s;.*<apple>\(\d*\)</apple>.*;\1;

Поскольку текст содержит «/», который является разделителем по умолчанию, и с помощью «;» как sep делает код более понятным. И я обнаружил, что упомянутое не жадное совпадение @Conspicuous Compiler должно быть

\{-}

вместо "{-}" в Vim. Тем не менее, я после изменения Заметного 'решения на

%s/.*apple>(.\{-\})<\/apple.*/\1^M/g

мой Вим сказал, что не может найти шаблон.

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