El comando sed de Linux es una poderosa y polivalente herramienta que nos saca de más de un apuro, aunque no la lleguemos a utilizar en todo su potencial. Resulta especialmente útil para realizar sustituciones masivas, del tipo cambiar «bar» por «foo» en un centenar de archivos.

La sintaxis básica del comando es sencilla:

sed ´s/bar/foo/g´ miarchivo.txt

Los problemas empiezan cuando la cadena a sustituir no es una simple palabra sino una línea de código HTML, por ejemplo:

Como cabe imaginar, hay caracteres en esta cadena (comillas, barra, etc) que interfieren con la sintaxis de sed y dificultan la identificación de la cadena, cuando no devuelven un error. Obviamente se puede intentar «escapar» los caracteres molestos precediéndolos de una barra invertida (\), pero en cadenas largas esto se puede complicar. El número de barras puede ser elevado y es fácil dejarse alguna por el camino, legibilidad aparte. Además, el «escapado» de las comillas simples puede acabar siendo una pesadilla que deriva en comportamientos no esperados (y hablamos por experiencia).

Para hacer el camino más suave, aquí van un par de consejos que no siempre se tienen en cuenta:

  • En sed, el delimitador por defecto es la barra (/), pero se puede utilizar cualquier otro carácter. El carácter inmediatamente siguiente a la s inicial se tomará como delimitador.
  • El argumento de sed irá entrecomillado a menos que la sustitución sea del tipo palabra por palabra. En la inmensa mayoría de los ejemplos veremos que se emplean comillas simples, puesto que si se usan comillas dobles se interpretarán los posibles caracteres especiales que contenga el argumento. Pero en casos como el que nos ocupa, nos puede salvar del apuro.

Por tanto, en nuestro caso, el comando de sustitución quedaría así:

sed -i "s||nuevo_texto|g" miarchivo.txt

Utilizamos el argumento -i para que los cambios se apliquen, puesto que si lo quitamos, estaríamos haciendo un «dry run» que simplemente volcaría el resultado por pantalla, dejando el archivo intacto.

Aunque todo se puede mejorar y los más avezados tirarán de complejas expresiones regulares, a veces un par de cambios sencillos como estos nos pueden ahorrar bastante tiempo.