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\"
Jawaban:
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
sed
dapat menggunakan karakter apa pun sebagai pembatas (tanpa harus mendeklarasikan pembatas baru), Anda dapat mencoba menggunakan pembatas lain yang tidak muncul di string pengganti Anda:Perhatikan bahwa ini bukan bukti bullet: jika string pengganti nanti berisi
@
itu akan rusak karena alasan yang sama, dan urutan backslash seperti\1
masih akan ditafsirkan sesuai dengansed
aturan. Menggunakan|
sebagai pembatas juga merupakan opsi yang bagus karena mirip dengan keterbacaan/
.sumber
g
)."
tidak'
sebaliknya Anda akan mendapatkan banyak$content
hasil akhir Anda alih-alih konten$content
:))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.htmlinfo 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. "