Відповіді:
\ 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$.