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

  • ¿Es eso exactamente lo que ' re ¿Qué pasa si quitas -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.)
  • En realidad, eso lo resuelve, al menos para mí. Deben sustituirse las comillas dobles y simples. por " y ', respectivamente.
  • Sm citas de arte (?)! .. 🙂
  • Lo que pegué fue exactamente lo que estaba ejecutando. ¿Alguien puede publicar una respuesta?
  • La próxima vez, publique el mensaje de error que está viendo cuando hace la pregunta. Ahorrará tiempo para todos.

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *