Как удалить все, кроме определенного шаблона в Vim?

#vim

#vim

Вопрос:

У меня есть XML-файл, в котором меня интересует только атрибут size определенного элемента. Сначала я использовал

 global!/<proto name="geninfo"/d
  

чтобы удалить все строки, которые меня не волнуют. Это оставляет мне целую кучу строк, которые выглядят так:

 <proto name="geninfo" pos="0" showname="General information" size="174">
  

Я хочу удалить все, кроме значения «size».
Мой план состоял в том, чтобы использовать substitute, чтобы избавиться от всего, что не соответствует ‘size=»[digit]»‘, удалить строку ‘size’ и кавычки, но я не могу понять, как заменить отрицание строки.

Есть идеи, как это сделать, или идеи о лучшем способе достижения этой цели? В принципе, я хочу получить файл с одним номером (размером) на строку.

Ответ №1:

Вы можете использовать соответствующие группы:

 :%s/^.*size="([0-9]*)".*$/1/
  

Это заменит строки, которые содержат size="N" только N и не касаются других строк.

Объяснение: это будет искать строку, содержащую несколько случайных символов, затем где-то цепочку size=" , затем цифры, затем " , затем еще несколько случайных символов, затем конец строки. Теперь, что я сделал, так это то, что я заключил цифры в (экранированные) круглые скобки. Это создает группу. Во второй части команды поиска и замены я, по сути, говорю: «Я хочу заменить всю строку только содержимым этой первой группы» (называемой 1 ).

Ответ №2:

 :v:size="d ":d|%s:.*size="([^"] )".*:1:
  

Первая команда (до тех | пор, пока не будет удалена каждая строка, которая не соответствует size="<SOMEDIGIT(S)>" шаблону, вторая ( %s... удаляет все до и после изменения размера " " также будет удалена).

HTH