codice comando non valido., nonostante i periodi di escape, utilizzando sed


187

Essere costretti a utilizzare CVS per un client corrente e l'indirizzo modificato per il repository remoto. L'unico modo per trovare l'indirizzo remoto nel mio codice locale è una ricerca ricorsiva e la sostituzione.

Tuttavia, con il comando sed mi aspetterei di funzionare:

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

Ottengo un errore per ogni file:

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

Ho cercato di sfuggire ai periodi nella partita / sostituzione sed ma questo non risolve nulla.

Risposte:


476

Se sei su un OS X, questo probabilmente non ha nulla a che fare con il comando sed. Nella versione OSX di sed, l' -iopzione prevede un extensionargomento, pertanto il comando viene effettivamente analizzato come extensionargomento e il percorso del file viene interpretato come codice comando.

Prova ad aggiungere l' -eargomento in modo esplicito e fornendo ''come argomento a -i:

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

Vedere questo .


41
Se hai trascorso 10 minuti come ho fatto a trovare la differenza, è l'opzione -e
acheron55

9
Questa domanda risponde a RE error: illegal byte sequencesu MacOS.
JonasVautherin,

11
ho usato una stringa vuota '' come parametro per -i e ha funzionato, comesed -i '' 's/blah/xx/g'
Pierre Houston,

25
Per me, aggiungendo -edopo aver -ieffettuato il sedbackup di tutti i miei file in questo modo: "foo.txt" -> "foo.txt-e". Ovviamente quello che volevo era piuttosto -i '', cioè non eseguire il backup dei file modificati.
mdup,

3
Lo stesso problema per me. Questo -i -ecombinato con un findrisultato in molti molti file che finiscono in -e-e-e-e-e-e-e.
aspyct

39

Hai semplicemente dimenticato di fornire un argomento a -i. Passa -ia -i ''.

Ovviamente ciò significa che non si desidera eseguire il backup dei file; altrimenti fornire la propria estensione di scelta, come -i .bak.


6

Su OS X nulla aiuta i poveri utenti a diventare adeguati. La soluzione è:

brew install gnu-sed

E poi usa gsed invece di sed, che funzionerà come previsto.


1
Grazie per questa risposta, che ha funzionato benissimo per me! Lavorando sia su Linux che su Mac, preferirei di gran lunga l'accesso a uno strumento familiare piuttosto che imparare differenze arcane tra due strettamente correlate.
Stephen Shank,

3

Probabilmente il tuo nuovo dominio contiene /? In tal caso, prova a utilizzare un separatore diverso da /in sed, ad esempio #, ,ecc.

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

Sarebbe anche utile racchiudere la s///virgoletta singola anziché la doppia virgoletta per evitare sostituzioni variabili o altri comportamenti imprevisti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.