Respuestas:
OS X utiliza una combinación de herramientas BSD y GNU, por lo que es mejor consultar siempre la documentación (aunque tenía una que less
ni siquiera se ajustaba a la página de manual de OS X):
sed toma el argumento después -i
como la extensión para las copias de seguridad. Proporcione una cadena vacía ( -i ''
) para que no haya copias de seguridad.
Lo siguiente debería hacer:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
El -type f
es solo una buena práctica; sed se quejará si le das un directorio más o menos.
-exec
se prefiere sobre xargs
; no necesitas molestarte -print0
ni nada. Al {} +
final significa que find
agregará todos los resultados como argumentos a una instancia del comando llamado, en lugar de volver a ejecutarlo para cada resultado. (Una excepción es cuando se infringe el número máximo de argumentos de línea de comandos permitidos por el sistema operativo; en ese caso find
se ejecutará más de una instancia).
%
carácter: sed "s%localhost/site%blah/blah%"
. Otra alternativa es la barra invertida-escapar del separador: sed "s/localhost\/site/blah\/blah/"
.
illegal byte sequence
error? si es así, intente: LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
funcionó para mí.
/g
para múltiples ocurrencias comoLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Para el mac, un enfoque más similar sería este:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Como solución alternativa, estoy usando esta en Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
El crédito es para: la respuesta de Todd Cesere
Ninguno de los anteriores funciona en OSX.
Haz lo siguiente:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Una versión que funciona tanto en Linux como en Mac OS X (agregando el -e
interruptor a sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
Cada vez que escribo este comando, parece que siempre lo manguito u olvido una bandera. Creé un Gist en github basado en la respuesta de TaylanUB que hace un reemplazo global del directorio actual. Esto es específico de Mac OSX.
https://gist.github.com/nateflink/9056302
Es bueno porque ahora solo abro una terminal y luego copio:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
Puede obtener algunos errores de secuencia de bytes extraños, así que aquí está el código completo:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
Utilicé este formato, pero ... descubrí que tenía que ejecutarlo tres o más veces para que cambiara cada instancia, lo que me pareció extremadamente extraño. Ejecutarlo una vez cambiaría algunos en cada archivo pero no todos. Ejecutar exactamente la misma cadena dos o cuatro veces capturaría todas las instancias.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
a al final, de lo contrario solo reemplaza la primera aparición de thistext
en una línea. Entonces tu expresión regular debería sers/thistext/newtext/g
https://bitbucket.org/masonicboom/serp es una utilidad go (es decir, multiplataforma), probada en OSX, que realiza búsquedas y reemplazos recursivos de texto en archivos dentro de un directorio dado, y confirma cada reemplazo. Es nuevo, por lo que podría tener errores.
El uso se ve así:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
Consulte aquí para más información.
El comando en OSX debe ser exactamente el mismo que en Unix bajo la bonita interfaz de usuario.
-print0
agregar a las find
banderas y -0
a las xargs
banderas.
-exec sed -i s/this/that/g {} \+
lugar de -print
y xargs
xargs
podría ver el delimitado por espacios "./jacobus" como un archivo para pasar sed
, y luego con "R.txt" , ninguno de los cuales existe.
podría decir $ PWD en lugar de "."
apple.stackexchange.com
ya que no es lo suficientemente genérico para Linux ni para todos los desarrolladores.