sed -rn -e 's|>[[:space:]]*<|>\n<|g # Insert newlines before each element
/^[^<]/ D # If not starting with <, delete until 1st \n and restart
/^<[^t]/ D # If not starting with <t, ""
/^<t[^i]/ D # If not starting with <ti, ""
/^<ti[^t]/ D
/^<tit[^l]/ D
/^<titl[^e]/ D
/^<title[^>]/ D # If not starting with <title>, delete until 1st \n and restart
s|^<title>|| # Delete <title>
s|</title>[^\n]*|| # Delete </title> and everything after it until the newline
P # Print everything up to the first newline
D' rss.xml # Delete everything up to the first newline and restart
Под «перезапуском» я имею в виду возврат к началу сценария sed и представьте, что мы просто читаем все, что осталось.
Я много узнал о написании этого текста. Тем не менее, нет никаких сомнений в том, что вы действительно должны делать это в Perl (или в awk, если вы старой школы).
В Perl это будет perl -pe 's%.*?<title>(.*?)</title>(?:.*?(?=<title>)|.*)%$1\n%g' rss.xml
Что в основном использует преимущество минимального соответствия (. *? Не является жадным, оно будет соответствовать наименьшему количеству возможных символов). Позитивный взгляд в конце состоит в том, чтобы я мог сделать это в одном выражении, все еще удаляя все в конце. Есть несколько способов ...
Если вам нужно несколько тегов из этого XML-файла, это, вероятно, все еще возможно, но, вероятно, потребует разветвления и т. П.