sed удалить несколько строк

У меня небольшая проблема с удалением нескольких строк с помощью sed. Я прочитал много руководств и обсуждений, но ни одно из них не помогло. У меня есть файл xml, и мне нужно удалить больше вхождений этих трех строк:

<function type="class">
   <arg name="class.name">com.mycompany.name.UnLockIssueFunction</arg>
</function>

Я хотел использовать удаление только части между <function>, но этих тегов больше. Мой xml-файл выглядит так

<post-functions>
  <function type="class">
    <arg name="class.name">com.mycompany.name.function.issue.UpdateIssueStatusFunction</arg>
  </function>
  <function type="class">
    <arg name="class.name">com.mycompany.name.function.misc.CreateCommentFunction</arg>
  </function>
  <function type="class">
    <arg name="class.name">com.mycompany.name.function.issue.GenerateChangeHistoryFunction</arg>
  </function>
  <function type="class">
    <arg name="class.name">com.mycompany.name.function.issue.IssueReindexFunction</arg>
  </function>
  <function type="class">
    <arg name="class.name">com.mycompany.name.function.event.FireIssueEventFunction</arg>
    <arg name="eventTypeId">13</arg>
  </function>
  <function type="class">
    <arg name="class.name">com.mycompany.name.UnLockIssueFunction</arg>
  </function>
</post-functions>

person Jamalissimo    schedule 25.10.2012    source источник
comment
Вы хотите удалить все, что находится между <function type="class"> и </function>, или включая теги?   -  person askmish    schedule 25.10.2012
comment
Вы должны сделать это с sed? Было бы намного лучше использовать язык сценариев с библиотекой разбора DOM.   -  person Barmar    schedule 25.10.2012
comment
Использовать анализатор XML   -  person    schedule 25.10.2012


Ответы (2)


Это может сработать для вас (GNU sed):

sed '/<function type="class">/!b;N;N;/<function type="class">\s*\n\s*<arg name="class.name">com.mycompany.name.UnLockIssueFunction<\/arg>\s*\n\s*<\/function>/d' file
person potong    schedule 25.10.2012
comment
Большое спасибо! Это именно то, что мне было нужно - person Jamalissimo; 25.10.2012
comment
@Jamalissimo (возможно, вы захотите принять ответ, чтобы потонг был должным образом вознагражден) - person P Marecki; 11.11.2012

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

Поиск и удаление нескольких строк

VIM: глобально сопоставить строку, удалить эту и 2 следующие строки

person Jeff Ferland    schedule 25.10.2012