martes, 19 de julio de 2011

Buscar y reemplazar un texto de forma recursiva

Las maravillosas tuberías (pipes) en linux nos permiten hacer maravillas como estas en la consola. Acá dejo varios casos de buscar y reemplazar:

  • Buscar y Reemplazar un texto recursivamente:

    $ find . -name "*.php" -print | xargs sed -i 's/texto_a_buscar/texto_nuevo/g'

  • Igual que el anterior pero para poder buscar saltos de línea:


    $ find . -name *.php -print | xargs sed -i ':a;N;$!ba;s/texto_a\nbuscar/texto_a\nreemplazar/g'

    Puesto que se trata de una expresión regular habrá que escapar los caracteres especiales, tales como '\' y '.' con '\'.
  • Encontrar archivos donde ocurre el 'texto', de forma recursiva y reemplazar un texto:

    $ find . -exec grep -li 'texto' {} \; | xargs sed -i 's/texto_a_buscar/texto_nuevo/g'

    Usar este comando así en un repositorio de svn es mala idea ya que también editará los archivos en los directorios ocultos de svn. Para evitar esto es mejor filtrar por tipo de archivo si es posible:

    $ find . -name *.php -exec grep -li 'texto' {} \; | xargs sed -i 's/texto_a_buscar/texto_nuevo/g'