Ответы:
\ 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$
.