He utilizado con éxito el siguiente sed
comando para buscar / reemplazar texto en Linux:
sed -i 's/old_link/new_link/g' *
Sin embargo, cuando lo pruebo en mi Mac OS X, obtengo:
"el comando c espera \ seguido de texto"
Pensé que mi Mac ejecuta un shell BASH normal. ¿Qué pasa?
EDITAR:
De acuerdo con @High Performance, esto se debe a que Mac tiene sed
un sabor diferente (BSD), por lo que mi pregunta sería, ¿cómo puedo replicar este comando en BSD sed
?
EDITAR:
Aquí hay un ejemplo real que causa esto:
sed -i 's/hello/gbye/g' *
sed
ve una "c" en sus datos como un comando. ¿Estás usando una variable? Publique algo que represente más de cerca el comando real y algunos datos que está procesando. Puede obtener una demostración simple de este error haciendoecho x | sed c
.Respuestas:
Si usa la
-i
opción, debe proporcionar una extensión para sus copias de seguridad.Si usted tiene:
El comando (tenga en cuenta la falta de espacio entre
-i
y''
y el-e
de hacer que funcione en las nuevas versiones de Mac y en GNU):Crea 2 archivos de respaldo como:
No hay una forma portátil de evitar hacer archivos de copia de seguridad porque es imposible encontrar una combinación de comandos sed que funcione en todos los casos:
sed -i -e ...
- no funciona en OS X ya que crea-e
copias de seguridadsed -i'' -e ...
- no funciona en OS X 10.6 pero funciona en 10.9+sed -i '' -e ...
- no funciona en GNUNota Dado que no hay un comando sed funcionando en todas las plataformas, puede intentar usar otro comando para lograr el mismo resultado.
P.ej,
perl -i -pe's/old_link/new_link/g' *
fuente
sed
puedo decir, usted proporcionó un sufijo de respaldo. El sufijo de respaldo ess/old_link/new_link/g
. Se supone que el siguiente argumento después de eso son los comandos de edición. Debido a que interpretó los comandos como el nombre de la copia de seguridad, tomó el primer nombre de archivo como los comandos de edición, pero no fueron válidos.sed -i '' -e ...
?sed -i'' -e
parece no funcionar como se esperaba en mac 10.14Creo en OS X cuando usas -i se requiere una extensión para los archivos de respaldo . Tratar:
Usando GNU
sed
la extensión es opcional .fuente
Esto funciona con las versiones GNU y BSD de sed:
o con respaldo:
¡Observe el espacio perdido después de la
-i
opción! (Necesario para GNU sed)fuente
rm
comando justo después para eliminarlo.sed -i'' ...
=>sed -i '' ...
Tuve el mismo problema en Mac y lo resolvió con
brew
:y usar como
también puede establecer como
sed
aliasgsed
(si lo desea):fuente
O bien, puede instalar la versión GNU de sed en su Mac, llamada gsed, y usarla utilizando la sintaxis estándar de Linux.
Para eso, instale
gsed
usando puertos (si no lo tiene, consígalo en http://www.macports.org/ ) ejecutandosudo port install gsed
. Entonces, puedes corrersed -i 's/old_link/new_link/g' *
fuente
gnu-sed
De hecho, su Mac ejecuta un shell BASH, pero esta es más una cuestión de qué implementación de sed está tratando. En una Mac sed proviene de BSD y es sutilmente diferente de la sed que puede encontrar en una caja típica de Linux. Te sugiero
man sed
.fuente
La respuesta de Sinetris es correcta, pero uso esto con el
find
comando para ser más específico sobre los archivos que quiero cambiar. En general, esto debería funcionar (probado en osx/bin/bash
):En general, cuando se usa
sed
sinfind
proyectos complejos es menos eficiente.fuente
-exec
¡es muy lindo! Solo me pregunto si la barra al final es realmente necesaria\
, el;
intérprete lo interpretó cuando lo intentéHe creado una función para manejar la
sed
diferencia entre MacOS (probado en MacOS 10.12) y otro sistema operativo:Uso:
Dónde:
,
es un delimitador's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
es patrón"./mysql/.env"
es la ruta al archivofuente
Aquí se explica cómo aplicar variables de entorno al archivo de plantilla (sin necesidad de copia de seguridad).
1. Cree una plantilla con {{FOO}} para reemplazarla más tarde.
2. Reemplace {{FOO}} con la variable FOO y envíe al nuevo archivo foo.conf
Trabajando tanto macOS 10.12.4 como Ubuntu 14.04.5
fuente
Como indican las otras respuestas, no hay una manera de usar sed de manera portátil en OS X y Linux sin hacer archivos de respaldo. Entonces, en su lugar, usé esta línea de Ruby para hacerlo:
En mi caso, necesitaba llamarlo desde una
rake
tarea (es decir, dentro de un script Ruby), así que utilicé este nivel adicional de citas:fuente
Funciona tanto en BSD como en Linux
fuente
e
agregado