Quero excluir tudo, menos uma mensagem. Por exemplo, se tivermos o seguinte:
<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>: "Massive demographic change has political consequences." <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>
O resultado após usar o comando deve ficar assim:
Massive demographic change has political consequences.
Minha tentativa até agora
sed -n "/<p class="TweetTextSize js-tweet-text tweet-text" lang="en" data-aria-label-part="0">/,/<\/p>/p">>
O que estou tentando fazer é deletar o que está dentro de todo <> </>
padrão <p> </p>
e manter o resto. Eu sei que não parece fácil, mas ainda assim agradeceria qualquer ajuda.
Responder1
A solução usandoxmstarletferramenta:
xmlstarlet sel -t -v "/p/text()[2]" -n file | sed 's/.*"\(.*\)"/\1/'
A saída:
Massive demographic change has political consequences.
sel
opção
sel (ou select) - Selecione dados ou consulte documentos XML (XPATH, etc)
-t
--opções de modelo
-v
opção
-v ou --value-of - imprime o valor da expressão XPATH
/p/text()[2]
- Expressão XPath, seleciona o segundo nó de texto do parágrafo (o primeiro nó de texto é .
)
sed 's/.*"\(.*\)"/\1/'
- para extrair a mensagem entre aspas duplas