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?

Nishant George Agrwal
sumber
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/

Bruno Reis
sumber
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'
                                     ^
alestanis
sumber
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