Sed neden tüm olayların yerini almıyor?


118

Bu kodu bash'da çalıştırırsam:

echo dog dog dos | sed -r 's:dog:log:'

çıktı verir:

log dog dos

Tüm köpek oluşumlarının yerini almasını nasıl sağlayabilirim?


2
gKüresel ikame için bayrağa ihtiyacınız var, buradaki -rseçeneğe de ihtiyacınız yok.
Chris Seymour

Yanıtlar:


188

gSed , şablon tamponunun içeriğinin genel bir ikamesini gerçekleştirecek şekilde değiştiriciyi eklemelisiniz :

echo dog dog dos | sed -e 's:dog:log:g'

Sed ile ilgili harika dokümantasyon için http://www.grymoire.com/Unix/Sed.html adresini kontrol edin . Bu küresel bayrak burada açıklanmıştır: http://www.grymoire.com/Unix/Sed.html#uh-6

İçin resmi belgeler http://www.gnu.org/software/sed/manual/ adresindeGNU sed mevcuttur.


1
Buraya GNU sed için bir köşe durumu eklemek: sed -E 's,foo,bar,g'küresel bir şey yapmaz. Eğer değiştirirsen sed -E -e 's,foo,bar,g'işe yarıyor.
Melvyn Sopacua

23

gSonuna bir koymalısınız , "global" anlamına gelir:

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
mevcut olmayan sed -r yerine sed -e kullanılmalıdır.
Dylan Daniels

1
@DylanDaniels Ubuntu'ya göre man sed, -rseçenek "genişletilmiş normal ifadeler kullan" anlamına gelir. Bu nedenle verilen komut, çalışması için genişletilmiş normal ifadelerin özelliklerine ihtiyaç duymasa da iyi çalışıyor.
Craig McQueen
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.