Reemplazar todas las apariciones de un término en los archivos contenidos en una carpeta

Reemplazar todas las apariciones de un término en los archivos contenidos en una carpeta

En una carpeta de mi sistema, tengo un C++proyecto que estoy intentando compilar.

Este proceso utiliza algunos C++modismos que no son compatibles con mi versión del compilador. En particular, a menudo dentro del código se utiliza el valor de los datos 'nullptr'.

Lo que quiero hacer es reemplazar todas las apariciones de nullptrcon NULL.

Puedo hacer esto VIMcon el comando:

:%s/nullptr/NULL/g 

¿Cómo puedo hacer esto para todos los archivos en un directorio una vez, sin abrir cada archivo y ejecutar el comando?

Respuesta1

for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

Sin embargo, esto no afecta a los subdirectorios.

Editar 1

La solución más rápida (con GNU):

find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g

Esto también afectaría a los subdirectorios (y a los archivos de puntos). Agregue -maxdepth 1si eso no es deseado.

Respuesta2

Dos formas de hacer esto:

empuje

Puedes usar vim desde la línea de comando así:

$ vim -c "%s/nullptr/NULL/g|wq" foo.txt

Envolver en un bucle for:

$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done

perla

$ perl -p -i -e 's/nullptr/NULL/g' foo.txt

Envolver en un bucle for:

$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done

O simplemente:

$ perl -p -i -e 's/nullptr/NULL/g' -- *

Respuesta3

Con herramientas GNU:

grep -rlZ nullptr /path/to/dir |
  xargs -r0 sed -i s/nullptr/NULL/g

Para evitar tener que reescribir cada archivo.

Como siempre con sed -i, tenga en cuenta que puede romper enlaces (hardware y soft), alterar la propiedad y el permiso de los archivos y cambiar la escasez y otros atributos potencialmente poco comunes de los archivos. También tenga en cuenta que las versiones de GNU grepanteriores 2.12siguen enlaces simbólicos al descender en el árbol de directorios con -r.

información relacionada