Odpowiedzi:
\ b w wyrażeniach regularnych dopasuj granice słowa (tj. miejsce między pierwszym znakiem słowa a znakiem innym niż słowo):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
uratowałem dzień :)
W systemie Mac OS X żadna z tych składni wyrażeń regularnych nie działa wewnątrz seda w celu dopasowania całych słów
\bmyWord\b
\<myWord\>
Posłuchaj mnie teraz i uwierz później, ta brzydka składnia jest tym, czego potrzebujesz:
/[[:<:]]myWord[[:>:]]/
Tak więc, na przykład, aby zastąpić miętę z Minty tylko dla całych słów:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Źródło: strona podręcznika re_format
sed
(i każde inne narzędzie GNU) przez MacPorts lub Homebrew i upewnij się, że jest pierwsze w twoim PATH
. Możliwe jest sprawienie, aby Mac był dość użyteczny.
brew install coreutils
, które poprzedzają wszystkie narzędzia GNU.
brew install gnu-sed
do użyciagsed
perl -pe 's|\bone\b|two|g'
. Działa stabilnie, gdy sed zawodzi tu i tam.
Użyj \b
do granic słów:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Oczywiście miałeś na myśli sed -i 's/\boldtext\b/newtext/g'
W jednym z moich komputerów ograniczanie słowa „ \b
” (bez cudzysłowów) nie działało. Rozwiązaniem było użycie „ \<
” jako początku separatora i „ \>
” jako końcowego separatora.
Aby wyjaśnić na przykładzie Joakima Lundberga :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
w poleceniu powłoki:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
lub:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
ale jeśli jesteś w vimie, możesz użyć tylko późniejszego:
:% s/\<old\>/new/g
$ 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
powoduje to zwinięcie wielu spacji w jedną i odrzucenie wszelkich spacji wiodących / końcowych: np no bar embarassment$
. daje .