Відповіді:
\ 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"
Джерело: сторінка man re_format
sed
(і будь-який інший інструмент GNU) через MacPorts або Homebrew і переконайтесь, що він перший у вашому PATH
. Можна зробити Mac досить зручним.
brew install coreutils
приводу я можу напевно підказати , які префікси є усіма інструментами gnu.
brew install gnu-sed
користуватисяgsed
perl -pe 's|\bone\b|two|g'
. Працює стабільно, поки сідалка провалюється тут і там.
Використовувати \b
для меж слова:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Ви, очевидно, мали на увазі sed -i 's/\boldtext\b/newtext/g'
В одній моїй машині розмежування слова з " \b
" (без лапок) не працювало. Рішення полягало у використанні " \<
" для запуску роздільника та "\>
" для закінчення роздільника.
Пояснити на прикладі Йоакіма Лундберга :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
$ 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$
.