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.

ksuralta.dll
sumber

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
Joakim Lundborg
sumber
9
bukan posix | GNU sed OK
Oleg Mazko
@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

Larry Gerndt
sumber
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>
Mitch Wheat
sumber
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
Arun
sumber
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
arganzheng
sumber
-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
anjing hantu74
sumber
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