sed ha esito negativo con errore "opzione sconosciuta a" s "


158

Sto provando a usare

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

comunque ottengo questo errore:

sed: -e expression #1, char 34: unknown option to `s'

Non capisco perché dal momento che questo funziona perfettamente:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

Qualche idea su cosa sto facendo di sbagliato?

Potrebbe essere questo il problema? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
Il messaggio di errore * BSD (incluso OSX) è "flag non valido nel comando sostitutivo:" - includendolo qui per renderlo un po 'più googlabile.
triplo

Risposte:


355

Il problema è con le barre: la variabile le contiene e il comando finale sarà qualcosa di simile sed "s/string/path/to/something/g", contenente troppe barre.

Dal momento che sedpuò prendere qualsiasi carattere come delimitatore (senza dover dichiarare il nuovo delimitatore), puoi provare a usarne un altro che non appare nella stringa di sostituzione:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

Nota che questo non è a prova di proiettile: se la stringa di sostituzione in seguito la contiene @, si interromperà per lo stesso motivo e eventuali sequenze di barre rovesciate simili \1verranno comunque interpretate in base alle sedregole. L'uso |come delimitatore è anche una buona opzione in quanto è simile nella leggibilità a /.


38
Solo una nota per aiutare i futuri utenti, poiché ho trovato utile anche questa risposta. Il poster originale molto probabilmente aveva qualcosa in sostituzione (molto probabilmente nascosto nella variabile) che conteneva barre. Dopo che è stata rilevata la prima di queste barre, sed ha ritenuto che la sostituzione fosse terminata, e qualunque cosa venisse dopo come opzione (come g).
Brian Warshaw,

4
Ben fatto (ricorda di racchiudere le espressioni variabili con "non 'altrimenti otterrai molto $contentnel risultato finale invece del contenuto di $content:))

1
@AbstractDissonance Forse se stai sostituendo una password o qualcosa di strano o casuale hai ancora @. È necessario trovare un delimitatore che non è contenuto nella stringa di sostituzione.
Xavi Montero,

5
@ppumkin sostituisce semplicemente i delimitatori "barra rovesciata" come ie: sed -i "s/../../g"con carattere diverso, cioè :, sed -i "s@...@...@g"quindi il problema delle barre multiple dovrebbe scomparire. E se si utilizza "invece di 'quanto dovrebbe funziona bene anche con le variabili all'interno, vale a dire: export var1=bar; sed -i "s@foo@${var1}@g". Maggiori informazioni sono disponibili nella fantastica documentazione di sed: grymoire.com/Unix/Sed.html
Egel,

1
Vedi info sed(fonte: unix.stackexchange.com/questions/259083/… ): "La sintassi del comando s (come in sostituzione) è 's / regexp / sostituzione / flags'. I caratteri / possono essere uniformemente sostituiti da qualsiasi altro carattere singolo all'interno di un dato comando ".
Gabriel Staples il
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.