martes, 11 de octubre de 2011

Comando para eliminar una línea de un archivo de texto según expresión regular

Si queremos eliminar una sola línea de texto de un archivo de texto, podemos usar el comando sed de la siguiente forma:

$ sed -i '/regexp/d' /ruta_del_archivo

La opción -i le indica a sed que edite y guarde los cambios hechos al archivo. Veamos un ejemplo práctico:

En mi caso he usado este comando para eliminar las etiquetas @version de algunos archivos autogenerados por symfony (como en los módulos creados con el admin generator), para hacer esto lo combino con find para buscar recursivamente los archivos donde se encuentre esta etiqueta y los paso como entrada para el comando sed que ya vimos:

$ find modules/ -name *.php -exec grep -l '@version' {} \; | xargs sed -i '/^ \* @version/d'

En este comando le indico a sed que elimine todas las líneas que comiencen con el texto ' * @version'. Usando el hecho de que estas líneas son las únicas que terminan con el caracter '$' podemos cambiar la expresión regular anterior así:

$ find modules/ -name *.php -exec grep -l '@version' {} \; | xargs sed -i '/\$$/d'

Aunque yo prefiero la primera opción ya que es más específica.

Fuentes: gentoo.org, zytrax.com