Estaba intentando reemplazar una línea con otra usando SED
Tengo 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 sed
que 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 xargs
se utiliza como delimitadores. Entonces, si tiene el archivo A X
, sed
se le indicará que actúe sobre los archivos A
y X
.
-exec
La 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, find
también descendería a subdirectorios.