sed, “bilinmeyen` `s '' seçeneği ile başarısız oluyor hatası


158

Kullanmaya çalışıyorum

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

Ancak bu hatayı alıyorum:

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

Bunun mükemmel çalıştığı için nedenini anlamıyorum:

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

Neyi yanlış yaptığım hakkında bir fikrin var mı?

Sorun bu olabilir mi? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
* BSD hata mesajı (OSX dahil) "yerine komutta hatalı bayrak": - bunu biraz daha googlable yapmak için buraya dahil.
Üçlü

Yanıtlar:


355

Sorun eğik çizgilerle ilgilidir: değişkeniniz bunları içerir ve son komut sed "s/string/path/to/something/g"çok fazla eğik çizgi içeren bir şey olacaktır .

Yana sed(yeni sınırlayıcı ilan etmek zorunda kalmadan) ayırıcı olarak herhangi bir karakter alabilir, kendi yedek dizede görünmüyor başka birini kullanarak deneyebilirsiniz:

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

Bunun kurşun geçirmez olmadığını unutmayın: yeni dize daha sonra içeriyorsa @, aynı nedenden ötürü kırılacaktır ve gibi ters eğik çizgi dizileri \1yine de sedkurallara göre yorumlanacaktır . |Sınırlayıcı olarak kullanmak , okunabilirlik açısından benzer olduğu için güzel bir seçenektir /.


38
Bu yanıtı da yararlı bulduğum için gelecekteki kullanıcılara yardımcı olacak bir not. Orijinal posterin yerine büyük olasılıkla eğik çizgi içeren bir şey (büyük olasılıkla değişkende gizli) vardı. Bu eğik çizgilerden ilkiyle karşılaşıldıktan sonra, sed, değiştirmenin sona erdiğini ve bir seçenek olarak gelen her şeyi (örneğin g) düşündü .
Brian Warshaw

4
Başardınız (Sadece değişken ifadeleri tamamlamayı unutmayın "değil 'sen bir sürü alırsınız aksi $contentiçeriğinin yerine son sonucu $content:))

1
@AbstractDissonance Bir şifreyi veya garip veya rastgele bir şeyi değiştiriyorsanız belki de @ 'de vardır. İkame dizinizde bulunmayan bir sınırlayıcı bulmalısınız.
Xavi Montero

5
@ppumkin sadece "ileri eğik çizgi" sınırlayıcılarını ie: gibi sed -i "s/../../g"farklı karakterlerle değiştirin yani:, sed -i "s@...@...@g"birden fazla eğik çizgi sorunu ortadan kalkmalıdır . Kullanmak Ve "yerine 'bunun gerektiği de değişkenleri iç, yani iyi çalışır: export var1=bar; sed -i "s@foo@${var1}@g". Daha fazla bilgi için müthiş sed belgelerini bulabilirsiniz: grymoire.com/Unix/Sed.html
Egel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.