Поиск и замена целого слова

Как выполнять поиск и замену целых слов с помощью sed?

Выполнение

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

также заменит частичные совпадения [oldtext], которые я не хочу делать.

Ответ 1

\ b в регулярных выражениях соответствуют границам слов (т.е. местоположение между символом первого слова и символом, отличным от слова):

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

Ответ 2

В Mac OS X ни один из этих синтаксисов regex не работает внутри sed для соответствия целым словам

  • \bmyWord\b
  • \<myWord\>

Услышьте меня сейчас и поверьте мне позже, этот уродливый синтаксис - это то, что вам нужно использовать:

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

Так, например, для замены монетного двора minty только для целых слов:

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

Источник: справочная страница re_format

Ответ 3

Используйте \b для границ слов:

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

Ответ 4

В одной из моих машин разделение слова на "\b" (без кавычек) не сработало. Решение заключалось в использовании "\<" для запуска разделителя и "\>" для окончания разделителя.

Чтобы объяснить с помощью пример Joakim Lundberg:

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

Ответ 5

в команде оболочки:

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

или

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

но если вы находитесь в vim, вы можете использовать только позже:

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

Ответ 6

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