Ответы:
\ b в регулярных выражениях соответствует границам слова (то есть местоположению между первым символом слова и символом, не являющимся словом):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\bспас положение :)
В Mac OS X ни один из этих синтаксисов регулярных выражений не работает внутри sed для сопоставления целых слов.
\bmyWord\b\<myWord\>Услышьте меня сейчас и поверьте мне позже, этот уродливый синтаксис - это то, что вам нужно использовать:
/[[:<:]]myWord[[:>:]]/Так, например, заменить мяту с Минти для только целых слов:
sed "s/[[:<:]]mint[[:>:]]/minty/g"Источник: справочная страница re_format
sed(и любой другой инструмент GNU) через MacPorts или Homebrew и убедитесь, что он идет первым в вашем PATH. Можно сделать Mac достаточно удобным в использовании.
brew install coreutils, который является префиксом всех инструментов GNU.
brew install gnu-sedиспользоватьgsed
perl -pe 's|\bone\b|two|g'. Работает стабильно, пока sed не работает то тут, то там.
На одной из моих машин разделение слова " \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"
но если вы находитесь в vim, вы можете использовать только последнее:
:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Eдает no bar embarassment$.