Jak wyszukiwać i zamieniać całe słowa za pomocą seda?
Robić
sed -i 's/[oldtext]/[newtext]/g' <file>
zastąpi również częściowe dopasowania, [oldtext]
których nie chcę, aby robił.
\ 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
źródło
sed
(i każde inne narzędzie GNU) przez MacPorts lub Homebrew i upewnij się, że jest pierwsze w twoimPATH
. 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:źródło
[]
:o,l
->[newtext],[newtext]
. Oczywiście miałeś na myślised -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 :
źródło
w poleceniu powłoki:
lub:
ale jeśli jesteś w vimie, możesz użyć tylko późniejszego:
źródło
źródło
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: npno bar embarassment$
. daje .