سؤال

كيف يمكنني البحث عن الكلمات بأكملها واستبدالها باستخدام sed؟

عمل

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

سيحل أيضًا محل التطابقات الجزئية لـ [oldtext] الذي لا أريد أن أفعله.

هل كانت مفيدة؟

المحلول

\ ب في التعبيرات العادية مباراة كلمة الحدود (أي الموقع بين الطابع الكلمة الأولى والحرف غير كلمة):

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

نصائح أخرى

في نظام التشغيل Mac OS X، لا من تركيبات regex هذه تعمل بالداخل سيد لمطابقة الكلمات بأكملها

  • \bmyWord\b
  • \<myWord\>

إسمعني الآن وصدقني لاحقاً هذا بناء الجملة القبيح هو ما تحتاج إلى استخدامه:

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

لذلك، على سبيل المثال، ليحل محل نعناع مع منتي للكلمات الكاملة فقط:

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

مصدر: إعادة تنسيق صفحة الرجل

استخدم \b للحدود الكلمة:

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

في واحد من الجهاز الخاص بي، ترسيم كلمة مع "\b" (بدون علامات التنصيص) لم تنجح. وكان الحل لاستخدام "\<" لبدء محدد و "\>" لإنهاء محدد.

لشرح مع مثال يواكيم ندبرغ الصورة:

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

وفي قيادة قذيفة:

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

وأو:

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

ولكن إذا كنت في همة، يمكنك استخدام فقط في وقت لاحق:

:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top