En el shell de Linux, el siguiente comando buscará y reemplazará recursivamente todas las instancias de 'this' con 'that' (no tengo un shell de Linux frente a mí, pero debería hacerlo).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
¿Cómo será un comando similar en OSX?
apple.stackexchange.com
ya que no es lo suficientemente genérico para Linux ni para todos los desarrolladores.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):https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
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 sobrexargs
; no necesitas molestarte-print0
ni nada. Al{} +
final significa quefind
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 casofind
se ejecutará más de una instancia).fuente
%
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:
fuente
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
El crédito es para: la respuesta de Todd Cesere
fuente
En Mac OSX 10.11.5 esto funciona bien:
fuente
Ninguno de los anteriores funciona en OSX.
Haz lo siguiente:
fuente
Una versión que funciona tanto en Linux como en Mac OS X (agregando el
-e
interruptor ased
):fuente
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:
fuente
Este es mi viable. en mac OS X 10.10.4
Los anteriores usan find para cambiar los archivos que no contienen el texto de búsqueda (agregue una nueva línea al final del archivo), que es detallado.
fuente
Si está utilizando un terminal zsh, puede usar comodines mágicos:
sed -i "" "s/search/high-replace/g" *.txt
fuente
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.
fuente
g
a al final, de lo contrario solo reemplaza la primera aparición dethistext
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í:
fuente
Consulte aquí para más información.
fuente
El comando en OSX debe ser exactamente el mismo que en Unix bajo la bonita interfaz de usuario.
fuente
-print0
agregar a lasfind
banderas y-0
a lasxargs
banderas.-exec sed -i s/this/that/g {} \+
lugar de-print
y xargsxargs
podría ver el delimitado por espacios "./jacobus" como un archivo para pasarsed
, y luego con "R.txt" , ninguno de los cuales existe.podría decir $ PWD en lugar de "."
fuente