Necesito buscar y reemplazar expresiones regulares en todos los archivos de una carpeta (y sus subcarpetas). ¿Cuál sería el comando de shell de Linux para hacer eso?
Por ejemplo, quiero ejecutar esto en todos los archivos y sobrescribir el archivo antiguo con el texto nuevo reemplazado.
sed 's/old text/new text/g'
Respuestas:
No hay forma de hacerlo usando solo sed. Deberá usar al menos la utilidad de búsqueda juntos:
Este comando creará un
.bak
archivo para cada archivo modificado.Notas:
-i
argumento para elsed
comando es una extensión GNU, por lo tanto, si está ejecutando este comando con los BSD,sed
deberá redirigir la salida a un nuevo archivo y luego cambiarle el nombre.find
utilidad no implementa el-exec
argumento en las cajas de UNIX antiguas, por lo que necesitará usar un| xargs
.fuente
\;
para?-i
por sí solo no crea un archivo de respaldo, y es lo que hace que sed realice la operación en el archivo en su lugar.{}
para?{}
será reemplazado por cada nombre de archivo encontrado porfind
y\;
le indica que el comando que necesita ejecutar termina en este punto.Prefiero usar
find | xargs cmd
overfind -exec
porque es más fácil de recordar.Este ejemplo reemplaza globalmente "foo" con "bar" en archivos .txt en o debajo de su directorio actual:
Las opciones
-print0
y-0
se pueden omitir si sus nombres de archivo no contienen caracteres extravagantes como espacios.fuente
find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' "s/foo/bar/g"
(tenga en cuenta que proporciona una cadena vacía al-i
argumento).Para la portabilidad, no confío en características de sed que sean específicas de Linux o BSD. En su lugar, utilizo el
overwrite
script del libro de Kernighan y Pike sobre el entorno de programación Unix.El comando es entonces
Y el
overwrite
guión (que utilizo en todas partes) esLa idea es que sobrescriba un archivo solo si un comando tiene éxito. Útil en
find
y también donde no querrías usarporque el shell trunca el archivo antes de
sed
poder leerlo.fuente
¿Puedo sugerir (después de hacer una copia de seguridad de sus archivos):
fuente
Ejemplo: reemplace {AutoStart} con 1 para todos los archivos ini en la carpeta / app / config / y sus carpetas secundarias:
fuente
fuente
Es posible que desee probar mi secuencia de comandos Perl de búsqueda / reemplazo masivo . Tiene algunas ventajas sobre las soluciones de utilidad encadenada (como no tener que lidiar con múltiples niveles de interpretación de metacaracteres de shell).
fuente
En caso de que el nombre de los archivos en la carpeta tenga algunos nombres regulares (como archivo1, archivo2 ...) que he usado para el ciclo.
fuente