Reemplace una línea que contenga caracteres especiales en todos los archivos de forma recursiva usando SED MAC

Reemplace una línea que contenga caracteres especiales en todos los archivos de forma recursiva usando SED MAC

Estaba intentando reemplazar una línea con otra usando SEDTengo MAC OS X Terminal un escenario en el que necesito reemplazar una línea en todos los archivos presentes en un directorio con otra línea. Ambas líneas son complejas y tienen diferentes caracteres y símbolos especiales.

¿Cómo puedo reemplazarlo?

necesito reemplazar

import { wait } from 'path/and-child-path'

con

import { wait } from 'path/path/and-child-path'

Lo que estaba intentando es

find . -type f | xargs sed -i '' "s@import { wait } from 'path/and-child-path'@import { wait } from 'path/and-child-path'@g"

Esto no funciona. Por favor, ayúdame.

Respuesta1

El sedque proporcionó tiene el mismo patrón de coincidencia y reemplazo (en caso de que no haya sido un error tipográfico), por lo que no puede esperar ningún cambio en los archivos. Además la ''broca no debería estar ahí.

Corrigiendo esos puntos, ustedharíaterminar con

find . -type f | xargs sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g"

Ese código seguirá fallando.en el caso general, porque los nombres de archivos pueden contener espacios (¡e incluso caracteres de nueva línea!), que es exactamente lo que xargsse utiliza como delimitadores. Entonces, si tiene el archivo A X, sedse le indicará que actúe sobre los archivos Ay X.

-execLa opción resuelve el problema directamente:

find . -maxdepth 1 -type f -exec sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g" {} +

Tenga en cuenta que también agregué -maxdepth 1; de lo contrario, findtambién descendería a subdirectorios.

información relacionada