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”]