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 nullptr
con NULL
.
Puedo hacer esto VIM
con 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 1
si 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 grep
anteriores 2.12
siguen enlaces simbólicos al descender en el árbol de directorios con -r
.