sed tam kelime arama ve değiştirme


120

Sed kullanarak tam kelimeleri nasıl arar ve değiştiririm?

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

[oldtext]ben de yapmasını istemediğim kısmi eşleşmelerin yerini alacak .

Yanıtlar:


164

Normal ifadelerde \ b, kelime sınırlarıyla eşleşir (yani, ilk kelime karakteri ile kelime olmayan karakter arasındaki konum):

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


@OlegMazko Ayrıca vim'de kullanmak için kabul edilebilir posix yöntemi aramaya geldim ve benim için işe yarayan şey s / \ <7 // g idi. Kodumdaki bir kelimenin başında 7'yi kaldırmaya çalışıyordum. Bu bağlantı, özellikle de JP'nin çözümü beni cevaba götürdü: stackoverflow.com/questions/3864467/… (herhangi bir nedenle sizinki gibi yerleştirmek için fiyat indirimi alamadım).
jimh

Teşekkürler "ve" kelimesini değiştirmeye çalışırken çıldırıyordum, bu yüzden \band\bgünü kurtardım :)
MitchellK

145

Mac OS X'te, bu normal ifade sözdizimlerinin hiçbiri tam kelimeleri eşleştirmek için sed içinde çalışmaz.

  • \bmyWord\b
  • \<myWord\>

Şimdi beni duy ve sonra inan bana, bu çirkin sözdizimi kullanmanız gereken şey:

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

Bu nedenle, örneğin, yerine nane ile Naneli yalnızca tam kelimeler için:

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

Kaynak: re_format kılavuz sayfası


19
Sadece GNU'yu sed(ve diğer tüm GNU araçlarını) MacPorts veya Homebrew aracılığıyla kurun ve PATH. Bir Mac'i oldukça kullanışlı hale getirmek mümkündür.
Jim Stewart

9
@JimStewart, 'OS X'teyken OS Xers gibi yapın' varsayan bir dizi aracı kırmanın harika bir yolu. Bununla birlikte, brew install coreutilstüm gnu araçlarının ön ekini kesinlikle önerebilirim .
ELLIOTTCABLE

16
brew install gnu-sedkullanmakgsed
k107

brew coreutils harika. komutların bir sürü gnu versiyonunu kuran başka demleme paketleri var mı yoksa geri kalanını ayrı ayrı kurmam gerekiyor mu?
ckot

2
Perl kullanarak her zaman daha iyi bir çözümdür: perl -pe 's|\bone\b|two|g'. Sed burada ve orada başarısız olurken kararlı bir şekilde çalışır.
Pavel Vlasov

13

\bKelime sınırları için kullanın :

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

3
Şunlara dikkat edin []: o,l-> [newtext],[newtext]. sed -i 's/\boldtext\b/newtext/g'
Belli

7

Makinemden birinde, kelimeyi " \b" ile (tırnak işaretleri olmadan) sınırlamak işe yaramadı. Çözüm, \<sınırlayıcıyı başlatmak için " \>" ve sınırlayıcıyı sonlandırmak için " " kullanmaktı.

Joakim Lundberg'in örneğiyle açıklamak gerekirse:

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

2

kabuk komutunda:

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

veya:

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

ama eğer vim içindeyseniz, sadece sonrasını kullanabilirsiniz:

:% 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 açıkça "sed kullanıyor" diyor
ndemou

Bu bölünmüş bir manipüle birleştirmedir, saf bir değiştirme değildir; Bu birine birden fazla boşluk çöker ve önünde / sonunda boşluk atar: örneğin echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Everir no bar embarassment$.
musiphil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.