Estoy usando el siguiente comando en mi mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
y parece no tener ningún efecto.
Tengo dos archivos en el directorio que terminan en .java, los cuales tienen el foo texto en ellos. ¿Me falta algo?
EDITAR: Resultados de la solicitud de comentarios
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i "s/foo/bar/g" {} \; sed: 1: "./bar.java": invalid command code . sed: 1: "./foo.java": invalid command code .
Comentarios
Responder
En primer lugar, asegúrese de que está utilizando ascii normal citas como "
y "
(códigos ascii 0x22
y 0x27
, respectivamente) en scripts de shell, porque el ejemplo en tu publicación contiene caracteres de comillas no estándar. Si miras de cerca, se ven un poco diferentes. Lo más probable es que este sea un error de copiar y pegar de un documento de texto enriquecido formato como Word, OOWriter o incluso una ventana del navegador.
Dado que estás en una Mac, lo más probable es que tengas la implementación de FreeBSD de sed
, en la que caso de que tenga que escribir el comando de esta manera:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(aquí usando +
en lugar de \;
para evitar ejecutar una sed
invocación por archivo).
En la implementación de FreeBSD de sed
el necesita un argumento: la extensión de un archivo de respaldo. Por ejemplo, con -i .bak
el comando haría una copia de seguridad de file1.txt
como file1.txt.bak
antes de realizar el reemplazo en el archivo original. Usar un argumento vacío ""
significa no usar un archivo de respaldo, que parece ser lo que desea.
Lo mismo en GNU (o NetBSD, OpenBSD , busybox) la implementación sería:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Gracias @bahamat y @Mikel y @ pieter-Breed por mejorar mi respuesta con sus comentarios.
Comentarios
- ¿Qué hacen las llaves?
- @ZaneHitchcox las llaves son marcadores de posición para el nombre de archivo coincidente
- ¿Qué ' s el
+
hacer al final? - @Anthony el
+
al final termina la lista de argumentos de la opción-exec
. Es requerido por la sintaxis de-exec
.
-exec
y todo lo que sigue? ¿Imprime los nombres de los archivos Java? (Me ' me preocupa que ' estás usando comillas tipográficas en lugar de comillas ASCII.)"
y'
, respectivamente.