buscar y sed (buscar y reemplazar)

buscar y sed (buscar y reemplazar)

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, y ambos tienen el texto foo. ¿Me estoy perdiendo de 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 .

Respuesta1

En primer lugar, asegúrese de utilizar comillas ASCII normales como "y '(códigos ASCII 0x22y 0x27, respectivamente) en los scripts de Shell, porque el ejemplo de su publicación contiene comillas no estándar. Si miras de cerca, se ven un poco diferentes. Lo más probable es que se trate de un error de copiar y pegar de un formato de documento de texto enriquecido como Word, OOWriter o incluso una ventana del navegador.

Como estás en una Mac, lo más probable es que tengas la implementación de FreeBSD sed, en cuyo caso debes escribir el comando de esta manera:

find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +

(aquí se usa +en lugar de \;para evitar ejecutar una sedinvocación por archivo).

Tenga en cuenta que esas comillas "s/foo/bar/g"son necesarias si fooo bartienen espacios.

En la implementación de FreeBSD, sedla -ibandera necesita un argumento: la extensión de un archivo de copia de seguridad. Por ejemplo, con -i .bakel comando haría una copia de seguridad file1.txtcomo file1.txt.bakprimero 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 la implementación de GNU (o NetBSD, OpenBSD, Busybox) sería:

find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +

Gracias@bahamaty@Mikely@pieter-razapor mejorar mi respuesta con tus comentarios.

información relacionada