sed ціле слово пошук і заміна


120

Як шукати та замінювати цілі слова за допомогою sed?

Робимо

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

також замінить часткові поєдинки, про [oldtext]які я не хочу цього робити.

Відповіді:


164

\ b у регулярних виразах відповідають межам слова (тобто розташування між першим символом слова та несловним символом):

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


@OlegMazko Я також прийшов шукати прийнятний для позиції метод для використання у vim, і те, що для мене спрацювало, було s / \ <7 // g. Я намагався видалити 7 на початку слова у своєму коді. Цей посилання, зокрема, рішення JP, привело мене до відповіді: stackoverflow.com/questions/3864467/… (не вдалося отримати позначку, щоб вставити його як ваше чомусь).
jimh

Дякую, що я зійшов з розуму, намагаючись зробити заміну на слово "і" так \band\bврятував день :)
MitchellK

144

У Mac OS X жоден із цих синтаксисів регулярних виразів не працює всередині sed, щоб збігати цілі слова

  • \bmyWord\b
  • \<myWord\>

Почуйте мене зараз і повірте мені пізніше, цей потворний синтаксис - це те, що вам потрібно використовувати:

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

Так, наприклад, замінити м'яту з Мінті для тільки цілих слів:

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

Джерело: сторінка man re_format


19
Просто встановіть GNU sed(і будь-який інший інструмент GNU) через MacPorts або Homebrew і переконайтесь, що він перший у вашому PATH. Можна зробити Mac досить зручним.
Джим Стюарт

9
@JimStewart чудовий спосіб зламати купу інструментів, які передбачають, що "в ОС X, роби як ОС Xers". З цього brew install coreutilsприводу я можу напевно підказати , які префікси є усіма інструментами gnu.
ELLIOTTCABLE

16
brew install gnu-sedкористуватисяgsed
k107

заварювати Coreutils є приголомшливим. Чи є інші пакети варива, які встановлюють цілу купу версій команд gnu чи мені потрібно інше встановлювати окремо?
ckot

2
Використання Perl завжди краще рішення: perl -pe 's|\bone\b|two|g'. Працює стабільно, поки сідалка провалюється тут і там.
Павло Власов

13

Використовувати \bдля меж слова:

sed -i 's/\boldtext\b/newtext/g' <file>

3
Будьте обережні з []: o,l-> [newtext],[newtext]. Ви, очевидно, мали на увазі sed -i 's/\boldtext\b/newtext/g'
JJoao

7

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

Пояснити на прикладі Йоакіма Лундберга :

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

2

в командній оболонці:

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

або:

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

але якщо ви знаходитесь у vim, ви можете використовувати лише пізніші:

:% s/\<old\>/new/g

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

ОП чітко зазначає "користування sed"
ndemou

Це розкол-маніпулювання-приєднання, а не чиста заміна; це згортає декілька пробілів в один і відкидає будь-які провідні / кінцеві пробіли: наприклад, echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Eдає no bar embarassment$.
musiphil
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.