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
.bakarchivo para cada archivo modificado.Notas:
-iargumento para elsedcomando es una extensión GNU, por lo tanto, si está ejecutando este comando con los BSD,seddeberá redirigir la salida a un nuevo archivo y luego cambiarle el nombre.findutilidad no implementa el-execargumento en las cajas de UNIX antiguas, por lo que necesitará usar un| xargs.fuente
\;para?-ipor 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 porfindy\;le indica que el comando que necesita ejecutar termina en este punto.Prefiero usar
find | xargs cmdoverfind -execporque 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
-print0y-0se 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-iargumento).Para la portabilidad, no confío en características de sed que sean específicas de Linux o BSD. En su lugar, utilizo el
overwritescript del libro de Kernighan y Pike sobre el entorno de programación Unix.El comando es entonces
Y el
overwriteguión (que utilizo en todas partes) esLa idea es que sobrescriba un archivo solo si un comando tiene éxito. Útil en
findy también donde no querrías usarporque el shell trunca el archivo antes de
sedpoder 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