Piccolo trucco per sed
Il comando sed (stream editor) è comodissimo quando si tratta di cercare e modificare delle stringhe in un file o, meglio ancora, in uno stream che arrivi da una pipe.
Se, per esempio, avessimo un file example.htm e volessimo sostituire tutte le occorrenze della stringa “guadagnare su Internet” con un link ad un sito specifico (es.: http://www.example.com) dovremmo usare questo comando:
cat example.htm | sed s/guadagnare\ su\ Internet/http:\\/\\/www\.example\.com/
Andiamo con ordine: cat example.htm non fa altro che leggere il file example.htm e mandare il suo contenuto su stdout.
Con la pipe ” | ” redirigiamo il flusso da stdout allo stdin del comando sed al quale passiamo tre parametri:
s: sostituisci quello che trovi dopo il primo delimitatore (nel nostro caso /) con quello che trovi dopo il secondo delimitatore
E’ molto probabile che il comando qui sopra non funzioni. Noterete che bisogna provvedere all’escaping di una serie di caratteri come lo spazio, il punto e, soprattutto, lo slash “/”.
Nei vari tentativi che ho fatto (non sono un guru delle regular expressions) mi sono spesso trovato ad inserire numeri casuali di \ per evitare che la regex mi desse un errore.
Poi: la grande scoperta! Il problema è che usiamo lo “/” per dire a sed qual è la stringa da cercare e con cosa sostituirla. Potremmo usare un altro carattere che non sia lo “/”? Sì! Possiamo usarne uno qualsiasi e ci semplificheremmo notevolmente la vita, perché non dovremmo più preoccuparci dell’escaping dello “/”
Il nostro comando, diventa
cat example.htm | sed s#guadagnare\ su\ Internet#http://www\.example\.com/#
Decisamente più semplice, no?