Как выполнять поиск и замену целых слов с помощью sed?
Выполнение
sed -i 's/[oldtext]/[newtext]/g' <file>
также заменит частичные совпадения [oldtext]
, которые я не хочу делать.
Как выполнять поиск и замену целых слов с помощью sed?
Выполнение
sed -i 's/[oldtext]/[newtext]/g' <file>
также заменит частичные совпадения [oldtext]
, которые я не хочу делать.
\ b в регулярных выражениях соответствуют границам слов (т.е. местоположение между символом первого слова и символом, отличным от слова):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
В Mac OS X ни один из этих синтаксисов regex не работает внутри sed для соответствия целым словам
\bmyWord\b
\<myWord\>
Услышьте меня сейчас и поверьте мне позже, этот уродливый синтаксис - это то, что вам нужно использовать:
/[[:<:]]myWord[[:>:]]/
Так, например, для замены монетного двора minty только для целых слов:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Источник: справочная страница re_format
Используйте \b
для границ слов:
sed -i 's/\boldtext\b/newtext/g' <file>
В одной из моих машин разделение слова на "\b
" (без кавычек) не сработало. Решение заключалось в использовании "\<
" для запуска разделителя и "\>
" для окончания разделителя.
Чтобы объяснить с помощью пример Joakim Lundberg:
$ 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