Come cercare un file XML e stampare testo di un determinato colore

Aug 25 2020

Ho provato grep, awk, sed e sto iniziando a provare xmlstarlet ma non trovo molto supporto con questo.

Immagino che xmlstarlet mi stia dicendo che l'XML è mal formato, ma tutto ciò che voglio fare è trovare tag che contengono un colore esadecimale specifico e stampare il testo tra i tag.

Il mio file.xml ha questo aspetto:

<p style=" margin-left: 80.0px;">Do not print this.</p>
<p style=" margin-left: 80.0px;"><span style=" color: #595959;">Print this.</span></p>

Ho provato

$ cat file.xml | grep -oP '(?<=\"<span style="color: #595959;">\").*?(?=\"</span>")'

grep non produce output

sed -n '/span style=" color: #595959/,/<\/span/p'  file.xml

sed restituisce l'intera riga e continua a stampare ogni riga successiva nel file xml, ma voglio solo il testo tra i tag.

awk -F "[><]" '/span style=" color: #595959;"’/{print $3} file.xml

Il comando awk viene eseguito ma non termina né stampa nulla.

xmlstarlet produce:

Unescaped '<' not allowed in attributes values

che si riferisce a un'altra riga nel file, ma immagino che questa violazione sia il motivo per cui xmlstarlet si arresta.

Risposte

MilanTodorovic Aug 26 2020 at 19:52

Considerando che file.xml non è formattato correttamente in xml, puoi fare quanto segue:

grep -o '<span style=\" color: #595959;">.*</span>' file.xml | xmllint --xpath 'string(//span)' -

La grepparte del comando troverà l'intera riga contenente il tag span desiderato (tag inclusi). La riga viene quindi reindirizzata a xmllint che utilizzerà la query xpath per individuare il testo. Tieni presente che questo funzionerà se non hai più tag span, che corrispondono ai criteri grep, nella stessa riga.

Tuttavia, se hai formato xml correttamente, puoi usare solo xmllint (ho appena messo i tag e attorno al tuo file), che è il modo preferito per lavorare con i file xml. Il comando sarebbe:

xmllint --xpath 'string((//span[@style=" color: #595959;"])[1])' file.xml

Nota [1]il comando. Viene utilizzato per mostrare il primo risultato della query. Se si dispone di più tag span con lo stesso attributo di stile, è possibile ottenere quei testi utilizzando [2], [3]ecc