Вот файл (названный как sample.xml):
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<blah1 value="ma">
<tag3>100MB</tag3>
</blah1>
<blah1 value="ba">
<tag3>20MB</tag3>
</blah1>
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>
<!-- This is tag with def value -->
<blah2 value="*" version="2.0" result="true">
<blah1 value="abc">
<blah1 value="def" result="true">
<tag2>on</tag2>
</blah1>
</blah1>
</blah2>
</configs>
Найдя строку с value="def"
, удалите весь блок, начиная с тегов <blah2> to </blah2>
Я не знаком с sed
паттерном удержания, но что-то, что я получил от Google, очень близко
sed -n '/<blah2.*>/,/<\/blah2>/{
H
/<\/blah2>/ {
s/.*//;x
/def/d
p
}
}' sample.xml
Ожидаемый результат:
<?xml version="1.0" encoding="UTF-8"?>
<configs>
<blah1 value="ma">
<tag3>100MB</tag3>
</blah1>
<blah1 value="ba">
<tag3>20MB</tag3>
</blah1>
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>
</configs>
Фактический результат (с указанным выше нерабочим седом):
<blah2 value="*" version="1.0" result="true">
<blah1 value="xyz">
<blah1 value="uvw" result="true">
<tag>4</tag>
</blah1>
</blah1>
</blah2>