Combina 2 etiquetas xml con SED

0

Creo un xmltv.xml para listados de TV y necesito usar SED para algún procesamiento posterior. Estoy usando Windows 10 con SED para Windows ejecutado a través de un archivo bat. El problema es que solo se muestran ciertas etiquetas en mi interfaz, así que necesito combinar el subtítulo con desc en el xml. Tengo un comando SED actual que ejecuto para agregar el subtítulo al título, pero no puedo entender el subtítulo para desc.

Así es como se ve un canal en el xml, pero no todos los programas tienen un subtítulo.

  <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>

Así es como agregaría un equipo de hockey del subtítulo al título usando 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

¿Alguien puede proporcionar un comando como el anterior para agregar el subtítulo a desc como este?

<desc lang="en">Subtitle Example : Description Example</desc>
halikus
fuente

Respuestas:

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>

Es una solución sed de GNU / Linux, pero creo que es fácil adaptarse a Windows. Puede intentar usar otro separador en sustitución y la opción -r para Regexp avanzado para evitar \/ \( \). Escribí algunas etiquetas literales ( </sub-title> </desc>), por lo que si hay algunos espacios en blanco adicionales, tendría que adaptarse.

Paulo
fuente