Come cercare un file XML e stampare testo di un determinato colore
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
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