Połącz 2 tagi XML z SED

0

Tworzę plik xmltv.xml dla list telewizyjnych i muszę użyć SED do niektórych czynności przetwarzania końcowego. Korzystam z systemu Windows 10 z SED dla Windows uruchamianego za pomocą pliku bat. Problem w tym, że tylko niektóre tagi są wyświetlane w moim interfejsie, więc muszę połączyć podtytuł z desc w xml. Mam bieżące polecenie SED, które uruchamiam, aby dołączyć podtytuł do tytułu, ale nie mogę znaleźć podtytułu do opisu.

Tak wygląda kanał w XML, ale nie wszystkie programy mają podtytuły.

  <programme start="20160422223500 -0500" stop="20160422233700 -0500" channel="Channel_ID">
<title lang="en">Program Name</title>
<sub-title lang="en">Subtitle Example</sub-title>
<desc lang="en">Description Example</desc>

W ten sposób dołączę drużynę hokejową od podtytułu do tytułu za pomocą sed.txt

cmd

sed.exe -f sed.txt <"xmltv.xml"> "xmltv2.xml"

sed.txt

:a;N;$!ba;s/\(<programme[^<]*\)\(<t[^>]*>\)\(NHL Hockey*[^<]*\)\(<[^<]*\)\(<sub-title[^>]*>\)\([^<]*\)[^<\/programme]*/\1\2\3: \6\4\5\6/g

Czy ktoś może podać polecenie takie jak powyżej, aby dołączyć podtytuł do opisu w ten sposób?

<desc lang="en">Subtitle Example : Description Example</desc>
halikus
źródło

Odpowiedzi:

0
sed -nr '/sub-title/ {N;s,/desc,&,;Tprint;s,<sub-title[^>]+>(.*)</sub-title>\n(<desc[^>]+>)(.*</desc>),\2\1 : \3,;:print};p' <<<'<programme start="500 -05" stop="700 -5" channel="Channel_ID">
<title lang="en">Program Name</title>
<sub-title lang="en">Subtitle Example</sub-title>
<desc lang="en">Description Example</desc>

<programme start="600 -05" stop="800 -5" channel="Channel_ID">
<title lang="en">Program Name foo</title>
<desc lang="en">Description Example bar</desc>
> '
<programme start="500 -05" stop="700 -5" channel="Channel_ID">
<title lang="en">Program Name</title>
<desc lang="en">Subtitle Example : Description Example</desc>

<programme start="600 -05" stop="800 -5" channel="Channel_ID">
<title lang="en">Program Name foo</title>
<desc lang="en">Description Example bar</desc>

Jest to rozwiązanie sed GNU / Linux, ale myślę, że łatwo przystosować się do systemu Windows. Możesz spróbować użyć innego separatora w podstawieniu i opcji -r dla zaawansowanego Regexp, aby tego uniknąć \/ \( \). Napisałem kilka dosłownych tagów ( </sub-title> </desc>), więc jeśli są jakieś dodatkowe spacje, musisz je dostosować.

Paulo
źródło