Cómo usar sed, awk o grep para eliminar un patrón determinado pero conservar todo lo demás

Cómo usar sed, awk o grep para eliminar un patrón determinado pero conservar todo lo demás

Quiero borrar todo menos un mensaje. Por ejemplo, si tenemos lo siguiente:

<p class="TweetTextSize  js-tweet-text tweet-text" lang="en" data-aria-label-part="0">.<a href="/TuckerCarlson" class="twitter-atreply pretty-link js-nav" dir="ltr" data-mentioned-user-id="22703645" ><s>@</s><b>TuckerCarlson</b></a>: &quot;Massive demographic change has political consequences.&quot; <a href="/hashtag/Tucker?src=hash" data-query-source="hashtag_click" class="twitter-hashtag pretty-link js-nav" dir="ltr" ><s>#</s><b>Tucker</b></a><a href="https://t.co/PKqNgaihMQ" class="twitter-timeline-link u-hidden" data-pre-embedded="true" dir="ltr" >pic.twitter.com/PKqNgaihMQ</a></p>

El resultado después de usar el comando debería verse así:

Massive demographic change has political consequences.

Mi intento hasta ahora

sed -n "/<p class="TweetTextSize  js-tweet-text tweet-text" lang="en" data-aria-label-part="0">/,/<\/p>/p">>

Lo que estoy tratando de hacer es eliminar lo que está dentro de todos <> </>los patrones intermedios <p> </p>y conservar el resto. Sé que no parece fácil pero aun así agradecería cualquier ayuda.

Respuesta1

La solución usandoxmstarletherramienta:

xmlstarlet sel -t -v "/p/text()[2]" -n file | sed 's/.*"\(.*\)"/\1/'

La salida:

Massive demographic change has political consequences.

selopción

sel (o select): selecciona datos o consulta documentos XML (XPATH, etc.)

-t--opciones de plantilla

-vopción

-v o --value-of - imprime el valor de la expresión XPATH


/p/text()[2]- Expresión XPath, selecciona el segundo nodo de texto del párrafo (el primer nodo de texto es .)

sed 's/.*"\(.*\)"/\1/'- para extraer el mensaje entre comillas dobles

información relacionada