Mengapa sed tidak menggantikan semua kemunculan?


118

Jika saya menjalankan kode ini di bash:

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

itu memberikan keluaran:

log dog dos

Bagaimana saya bisa membuatnya menggantikan semua kejadian anjing?


2
Anda memerlukan gbendera untuk substitusi global, Anda juga tidak memerlukan -ropsi di sini.
Chris Seymour

Jawaban:


188

Anda harus menambahkan gpengubah sehingga sed melakukan substitusi global dari konten buffer pola:

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

Untuk dokumentasi yang fantastis tentang sed, periksa http://www.grymoire.com/Unix/Sed.html . Ini dunia bendera dijelaskan di sini: http://www.grymoire.com/Unix/Sed.html#uh-6

Dokumentasi resmi GNU sedtersedia di http://www.gnu.org/software/sed/manual/


1
Menambahkan kasus sudut untuk GNU sed di sini: sed -E 's,foo,bar,g'tidak melakukan hal global. Jika Anda mengubahnya agar sed -E -e 's,foo,bar,g'berfungsi.
Melvyn Sopacua

23

Anda harus meletakkan gdi akhir, itu singkatan dari "global":

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

1
sed -e sebaiknya digunakan sebagai pengganti sed -r, yang tidak ada.
Dylan Daniels

1
@DylanDaniels Menurut man sedUbuntu, -ropsi ini berarti "gunakan ekspresi reguler yang diperluas". Jadi perintah yang diberikan berfungsi dengan baik, meskipun tidak memerlukan fitur ekspresi reguler yang diperluas agar berfungsi.
Craig McQueen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.