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.