Sed gagal dengan kesalahan "opsi tidak dikenal untuk` s '"

158

Saya mencoba menggunakan

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

namun saya mendapatkan kesalahan ini:

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

Saya tidak mengerti mengapa karena ini bekerja dengan sempurna:

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

Ada gagasan tentang kesalahan saya?

Mungkinkah ini masalahnya? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"

Tuan King
sumber
8
Pesan kesalahan * BSD (termasuk OSX) adalah "tanda buruk dalam perintah pengganti:" - termasuk di sini untuk membuat ini lebih googlable.
tripleee

Jawaban:

355

Masalahnya adalah dengan garis miring: variabel Anda berisi mereka dan perintah terakhir akan menjadi sesuatu seperti sed "s/string/path/to/something/g", mengandung terlalu banyak garis miring.

Karena seddapat menggunakan karakter apa pun sebagai pembatas (tanpa harus mendeklarasikan pembatas baru), Anda dapat mencoba menggunakan pembatas lain yang tidak muncul di string pengganti Anda:

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

Perhatikan bahwa ini bukan bukti bullet: jika string pengganti nanti berisi @itu akan rusak karena alasan yang sama, dan urutan backslash seperti \1masih akan ditafsirkan sesuai dengan sedaturan. Menggunakan |sebagai pembatas juga merupakan opsi yang bagus karena mirip dengan keterbacaan /.

Tomas Pruzina
sumber
38
Hanya catatan untuk membantu pengguna di masa depan, karena saya juga menemukan jawaban ini bermanfaat. Poster asli kemungkinan besar memiliki sesuatu dalam penggantinya (kemungkinan besar tersembunyi di variabel) yang berisi garis miring ke depan. Setelah tebasan pertama ditemukan, sed dianggap penggantian diakhiri, dan apa pun yang muncul berikutnya sebagai pilihan (seperti g).
Brian Warshaw
4
Bagus sekali (Ingatlah untuk membungkus ekspresi variabel dengan "tidak 'sebaliknya Anda akan mendapatkan banyak $contenthasil akhir Anda alih-alih konten $content:))
1
@AbstractDissonance Mungkin jika Anda mengganti kata sandi atau sesuatu yang aneh atau acak Anda masih memiliki @ di dalamnya. Anda harus menemukan pembatas yang tidak terkandung dalam string pengganti Anda.
Xavi Montero
5
@ppumkin baru saja mengganti "forward slash" pembatas seperti: sed -i "s/../../g"dengan karakter yang berbeda yaitu :, sed -i "s@...@...@g"maka masalah beberapa garis miring harus menghilang. Dan jika Anda menggunakan "bukannya 'seharusnya juga bekerja dengan baik dengan variabel dalam, yaitu: export var1=bar; sed -i "s@foo@${var1}@g". Info lebih lanjut dapat Anda temukan di dokumentasi sed yang mengagumkan: grymoire.com/Unix/Sed.html
Egel
1
Lihat info sed(sumber: unix.stackexchange.com/questions/259083/… ): "Sintaks perintah s (seperti pada pengganti) adalah 's / regexp / replacement / flags'. Karakter / dapat secara seragam diganti oleh yang lain karakter tunggal dalam perintah yang diberikan. "
Gabriel Staples