sed البحث عن كلمة كاملة واستبدالها
سؤال
كيف يمكنني البحث عن الكلمات بأكملها واستبدالها باستخدام 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