código de comando no válido., a pesar de los períodos de escape, usando sed

187

Ser obligado a usar CVS para un cliente actual y la dirección cambió para el repositorio remoto. La única forma que puedo encontrar para cambiar la dirección remota en mi código local es mediante una búsqueda y reemplazo recursivo.

Sin embargo, con el comando sed espero que funcione:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

Me sale un error por cada archivo:

sed: 1: ".//file/path ...": invalid command code .

Intenté escapar de los períodos en el emparejamiento / reemplazo de sed, pero eso no resuelve nada.

helion3
fuente

Respuestas:

476

Si está en un OS X, esto probablemente no tenga nada que ver con el comando sed. En la versión OSX de sed, la -iopción espera un extensionargumento, por lo que su comando se analiza realmente como el extensionargumento y la ruta del archivo se interpreta como el código del comando.

Intente agregar el -eargumento explícitamente y dar ''como argumento a -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Mira esto .

damienfrancois
fuente
41
Si
pasaste
9
Esta pregunta responde RE error: illegal byte sequencea MacOS.
JonasVautherin
11
utilicé una cadena vacía '' como parámetro para -i y funcionó, comosed -i '' 's/blah/xx/g'
Pierre Houston
25
Para mí, agregar -edespués de -ihacer una sedcopia de seguridad de todos mis archivos de esta manera: "foo.txt" -> "foo.txt-e". Obviamente, lo que quería era más bien -i '', es decir, no hacer una copia de seguridad de los archivos modificados.
mdup
3
El mismo problema para mi. Esto -i -ecombinado con un findresultado en muchos muchos archivos que terminan en -e-e-e-e-e-e-e.
aspyct
39

Simplemente olvidaste dar un argumento a -i. Solo cambia -ia -i ''.

Por supuesto, eso significa que no desea que se haga una copia de seguridad de sus archivos; de lo contrario, proporcione su extensión de elección, como -i .bak.

mdup
fuente
6

En OS X, nada ayuda a que el pobre desarrollo interno sea adecuado. La solucion es:

brew install gnu-sed

Y luego use gsed en lugar de sed, que funcionará como se esperaba.

Dmitry Mikushin
fuente
1
¡Gracias por esta respuesta, que funcionó muy bien para mí! Trabajando tanto en Linux como en Mac, preferiría mucho más el acceso a una herramienta familiar que aprender diferencias arcanas entre dos estrechamente relacionadas.
Stephen Shank
3

Probablemente su nuevo dominio contenga /? Si es así, intente usar un separador que no sea /en sed, por ejemplo #, ,etc.

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

También sería bueno encerrar s///entre comillas simples en lugar de comillas dobles para evitar la sustitución de variables o cualquier otro comportamiento inesperado

jkshah
fuente