código de comando inválido., apesar dos períodos de escape, usar sed

187

Sendo forçado a usar o CVS para um cliente atual e o endereço alterado para o repositório remoto. A única maneira de encontrar o endereço remoto no meu código local é uma pesquisa e substituição recursiva.

No entanto, com o comando sed, eu esperaria trabalhar:

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

Eu recebo um erro para cada arquivo:

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

Eu tentei escapar dos períodos na partida / substituição sed, mas isso não resolve nada.

helion3
fonte

Respostas:

476

Se você estiver em um OS X, isso provavelmente não tem nada a ver com o comando sed. Na versão OSX de sed, a -iopção espera um extensionargumento para que seu comando seja realmente analisado como oextension argumento e o caminho do arquivo seja interpretado como o código de comando.

Tente adicionar o -eargumento explicitamente e fornecer ''como argumento para -i:

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

Veja isso .

damienfrancois
fonte
41
Se você gastou 10 min como eu fiz encontrar a diferença, é opção -e
acheron55
9
Esta pergunta responde ao RE error: illegal byte sequenceno MacOS.
JonasVautherin
11
Eu usei uma string vazia '' como o parâmetro para -i e que funcionou, comosed -i '' 's/blah/xx/g'
Pierre Houston
25
Para mim, adicionar -edepois de -ifazer sedbackup de todos os meus arquivos desta maneira: "foo.txt" -> "foo.txt-e". Obviamente, o que eu queria era melhor -i '', ou seja, não faça backup dos arquivos alterados.
Mdup #
3
O mesmo problema para mim. Isso -i -ecombinado com um findresultado em muitos arquivos terminando em -e-e-e-e-e-e-e.
aspyct
39

Você simplesmente esqueceu de fornecer um argumento para -i. Apenas mude -ipara -i ''.

Claro que isso significa que você não deseja que seus arquivos sejam copiados; caso contrário, forneça sua extensão de escolha, como -i .bak.

mdup
fonte
6

No OS X, nada ajuda os pobres construídos a se tornarem adequados. A solução é:

brew install gnu-sed

E então use gsed em vez de sed, que funcionará como esperado.

Dmitry Mikushin
fonte
1
Obrigado por esta resposta, que funcionou muito bem para mim! Trabalhando no Linux e no Mac, eu preferiria o acesso a uma ferramenta familiar do que aprender diferenças misteriosas entre duas estreitamente relacionadas.
Stephen Shank
3

Provavelmente seu novo domínio contém / ? Se assim for, tente usar separador diferente /em sed, por exemplo #, ,etc.

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

Também seria bom incluir s///aspas simples em vez de aspas duplas para evitar a substituição de variáveis ​​ou qualquer outro comportamento inesperado

jkshah
fonte