sed mencari dan mengganti seluruh kata


120

Bagaimana cara mencari dan mengganti seluruh kata menggunakan sed?

Perbuatan

sed -i 's/[oldtext]/[newtext]/g' <file> 

juga akan mengganti kecocokan parsial [oldtext]yang tidak saya inginkan.

Jawaban:


164

\ b dalam ekspresi reguler cocok dengan batas kata (yaitu lokasi antara karakter kata pertama dan karakter bukan kata):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment


@OlegMazko Saya juga datang mencari metode posix yang dapat diterima untuk digunakan di vim dan yang berhasil untuk saya adalah s / \ <7 // g. Saya mencoba untuk menghapus 7 di awal kata dalam kode saya. Tautan ini, khususnya, solusi JP, membawa saya ke jawaban: stackoverflow.com/questions/3864467/… (tidak bisa mendapatkan penurunan harga untuk menyematkannya seperti milik Anda karena alasan tertentu).
jimh

Terima kasih, saya sudah gila mencoba mengganti kata "dan" jadi \band\b menyelamatkan hari ini :)
MitchellK

145

Di Mac OS X, tak satu pun dari sintaks regex ini bekerja di dalam sed untuk mencocokkan seluruh kata

  • \bmyWord\b
  • \<myWord\>

Dengarlah aku sekarang dan percayalah kemudian, ini sintaks jelek adalah apa yang Anda butuhkan untuk digunakan:

  • /[[:<:]]myWord[[:>:]]/

Jadi, misalnya, untuk mengganti mint dengan minty hanya untuk seluruh kata:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

Sumber: halaman manual re_format


19
Instal saja GNU sed(dan setiap alat GNU lainnya) melalui MacPorts atau Homebrew dan pastikan itu yang pertama di PATH. Dimungkinkan untuk membuat Mac cukup berguna.
Jim Stewart

9
@JimStewart cara yang bagus untuk memecahkan banyak alat yang menganggap 'ketika di OS X, lakukan seperti OS Xers.' Karena itu, saya pasti bisa menyarankan brew install coreutils, yang mengawali semua alat gnu.
ELLIOTTCABLE

16
brew install gnu-seduntuk menggunakangsed
k107

minuman coreutils luar biasa. apakah ada paket brew lain yang menginstal sejumlah besar versi perintah gnu atau apakah saya perlu menginstal sisanya satu per satu?
ckot

2
Menggunakan perl selalu solusi yang lebih baik: perl -pe 's|\bone\b|two|g'. Bekerja dengan stabil sementara sed gagal di sana-sini.
Pavel Vlasov

13

Gunakan \buntuk batasan kata:

sed -i 's/\boldtext\b/newtext/g' <file>

3
Hati-hati dengan []: o,l-> [newtext],[newtext]. Anda jelas bermaksud sed -i 's/\boldtext\b/newtext/g'
JJoao

7

Di salah satu mesin saya, membatasi kata dengan " \b" (tanpa tanda kutip) tidak berhasil. Solusinya adalah menggunakan " \<" untuk memulai pembatas dan " \>" untuk mengakhiri pembatas.

Untuk menjelaskan dengan contoh Joakim Lundberg :

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

2

dalam perintah shell:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

atau:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

tetapi jika Anda berada di vim, Anda hanya dapat menggunakan nanti:

:% s/\<old\>/new/g

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

OP secara eksplisit menyatakan "menggunakan sed"
ndemou

Ini adalah split-manipulate-join, bukan penggantian murni; ini menciutkan beberapa spasi menjadi satu dan membuang spasi di depan / di belakangnya: misalnya echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Ememberi no bar embarassment$.
musiphil
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.