sed поиск и замена всего слова - PullRequest
105 голосов
/ 23 июня 2009

Как мне искать и заменять целые слова, используя sed?

Doing

sed -i 's/[oldtext]/[newtext]/g' <file> 

также заменит частичные совпадения [oldtext], чего я не хочу.

Ответы [ 6 ]

146 голосов
/ 23 июня 2009

\ b в регулярных выражениях совпадают с границами слова (т. Е. Расположение между первым символом слова и несловесным символом):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
125 голосов
/ 20 апреля 2011

В Mac OS X ни этих синтаксисов регулярных выражений не работают внутри sed для сопоставления целых слов

  • \bmyWord\b
  • \<myWord\>

Услышь меня сейчас и поверь мне позже, этот уродливый синтаксис - это то, что тебе нужно использовать:

  • /[[:<:]]myWord[[:>:]]/

Так, например, заменить mint на minty только для целых слов:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

Источник: re_format man page

12 голосов
/ 23 июня 2009

Используйте \b для границ слова:

sed -i 's/\boldtext\b/newtext/g' <file>
7 голосов
/ 17 марта 2010

В одной из моих машин разделение слова с помощью "\b" (без кавычек) не сработало. Решением было использовать "\<" для начального разделителя и "\>" для конечного разделителя.

Объяснить с помощью Йоаким Лундберг * Пример 1007 *:

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
2 голосов
/ 19 ноября 2016

в команде оболочки:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

или

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

но если вы в vim, вы можете использовать только позже:

:% s/\<old\>/new/g
0 голосов
/ 17 марта 2010
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...