Как искать и заменять целые слова с помощью sed?
дела
sed -i 's/[oldtext]/[newtext]/g' <file>
также заменит частичные совпадения, [oldtext]
которых я не хочу.
\ 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
для границ слов:источник
[]
:o,l
->[newtext],[newtext]
. Вы, очевидно, имели в видуsed -i 's/\boldtext\b/newtext/g'
На одной из моих машин разделение слова "
\b
" (без кавычек) не работало. Решением было использовать «\<
» для начального разделителя и «\>
» для конечного разделителя.Чтобы объяснить на примере Йоакима Лундберга :
источник
в команде оболочки:
или:
но если вы находитесь в vim, вы можете использовать только последнее:
источник
источник
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
даетno bar embarassment$
.