Prendendo spunto da un mio articolo sulla conversione delle news da WordPress a Flatnuke vediamo come utilizzare i backreference delle espressioni regolari per sostituire delle stringhe di caratteri.

La sintassi di un backreference è “( )\n”; dove con le parentesi tonde si cattura la parte che matcha per essere eventualmente usata e con “\n” (dove n è un numero da 1 e 9) la variabile per risalire alla parte referenziata in precedenza.

Ad esempio supponiamo di voler isolare il contenuto di una stringa tra i tag <b> e </b>. Con le parentesi tonde “(.*)” catturo qualsiasi carattere (anche nessun carattere) e successivamente uso il “\1” per indicare i caratteri che ho estratto in precedenza.

alex@goku:~$ echo "<b>Ciao.</b>" | grep -E '<b>(.*)<\/b>'
<b>Ciao.</b>
alex@goku:~$ echo "<b>Ciao.</b>" | sed -n 's/<b>\(.*\)<\/b>/\1/p'
Ciao.
alex@goku:~$ echo "<h1>titolo</h2>" | grep -E '<h([1-9])>titolo</h\1>'
alex@goku:~$ echo "<h1>titolo</h1>" | grep -E '<h([1-9])>titolo</h\1>'
<h1>titolo</h1>

Ritornando al convertire da WordPress a Flatnuke (wp2fn) ho usato questa caratteristica per isolare le stringhe contenute fra i tag ” [ caption ] ” di WordPress. Da notare che tutti i caratteri “[ ] / ( )” all’interno della espressione regolare vanno preceduti dal carattere di escape “\” (backslash). Inoltre da notare che ho scritto “captio” invece di “caption” altrimenti wordpress lo riconosce come tag e non lo visualizza in questa pagina.

alex@goku:~$ grep -E '\[captio id=(.*)\](.*)\[/captio\]' 1294150483.xml
[captio id="attachment_207" align="aligncenter" width="300" captio="Export database WordPress in formato xml"]<a href="http://alfonsiweb.altervista.org/blog/wp-content/uploads/2010/12/esporta_wordpress.PNG" target="_blank"><img title="Export WordPress in formato xml" src="http://alfonsiweb.altervista.org/blog/wp-content/uploads/2010/12/esporta_wordpress-300x245.PNG" alt="Export WordPress in formato xml" width="300" height="245" /></a>[/captio]

Bene ora applichiamo la sostituzione tramite il comando sed usando i backreference:

alex@goku:~$ sed -ne 's/^\[captio id=.*\(<a href=.*<\/a>\).*/\1/p' 1294150483.xml

Otteniamo il link html senza il tag caption:

<a href="http://alfonsiweb.altervista.org/blog/wp-content/uploads/2010/12/esporta_wordpress.PNG" target="_blank"><img title="Export WordPress in formato xml" src="http://alfonsiweb.altervista.org/blog/wp-content/uploads/2010/12/esporta_wordpress-300x245.PNG" alt="Export WordPress in formato xml" width="300" height="245" /></a>

La stessa cosa si può ottenere usando una combinazione di grep e cut per eliminare un tag xml generico.

alex@goku:~$ grep '<pubDate>' news.20.xml | cut -d '>' -f2 | cut -d '<' -f1
Fri, 20 Aug 2010 15:30:12 +0000

Invece con i back reference:

alex@goku:~$ grep 'pubDate' news.20.xml
<pubDate>Fri, 20 Aug 2010 15:30:12 +0000</pubDate>
alex@goku:~$ grep -E '<pubDate>(.*)<\/pubDate>' news.20.xml | sed 's/<pubDate>//g' | sed 's/<\/pubDate>//g'
Fri, 20 Aug 2010 15:30:12 +0000

Oppure direttamente con il comando sed:

alex@goku:~$ grep 'pubDate' news.20.xml
<pubDate>Fri, 20 Aug 2010 15:30:12 +0000</pubDate>
alex@goku:~$ sed -n '/<pubDate>/{s/<pubDate>\(.*\)<\/pubDate>/\1/;p;}' news.20.xml
Fri, 20 Aug 2010 15:30:12 +0000
alex@goku:~$ sed -n '/<pubDate>/{s/<\(pubDate\)>\(.*\)<\/\1>/\2/;p;}' news.20.xml
Fri, 20 Aug 2010 15:30:12 +0000

[ad name=”HTML”]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.