Substituir text en múltiples fitxers amb sed

Si volem substituir una cadena de caràcters per una altra en un fitxer o en múltiples fitxers simultàniament i de forma recursiva1 ho podem fer amb aquesta comanda:

find -type f -exec sed -i 's/CADENA A SUBSTITUIR/CADENA NOVA/g' {} \;

On CADENA A SUBSTITUIR és una expressió regular. Això vol dir que hem d’escapar els caràcters amb connotacions especials amb una barra invertida \, com . + * [ ] etcètera.

També cal tenir en compte que això substituirà totes les aparicions de la cadena a substituir que es trobin per tots els fitxers. Si volem que només s’apliqui a certs fitxers, podem utilitzar el paràmetre -name de la comanda find.

Si combinem el que he dit als dos paràgrafs anteriors, per exemple la comanda:

find -type f -name aliments* -exec sed -i 's/pebrot (vermell)/maduixa vermella/g' {} \;

cercarà només en fitxers els noms dels quals comencin per aliments,  i substituirà pebrot (vermell) per maduixa vermella.

Ho podem complicar més, i aprofitar la paraula vermell de la cadena inicial i afegir-li la lletra a per fer-la femenina: vermella, tot amb expressions regulars:

find -type f -name aliments* -exec sed -i 's/\(pebrot (\)\(vermell\))/maduixa \2a/g' {} \;

Aquesta expressió crea dos grups: el primer conté “pebrot (” i el segon “vermell” (el darrer parèntesi queda fora de cap grup). Així podem usar la seqüència \2 per referir-nos al contingut del segon grup, al qual li afegim la lletra a per transformar-lo en “vermella”.

1 Si volem fer-ho en un sol fitxer o en varis sense necessitar la recursivitat no cal usar find, podem usar sed directament:

sed -i 's/CADENA A SUBSTITUIR/CADENA NOVA/g' fitxer1 *.txt
GD Star Rating
loading...