Wie suche und ersetze ich ganze Wörter mit sed?
Tun
sed -i 's/[oldtext]/[newtext]/g' <file>
wird auch Teilübereinstimmungen ersetzen, von [oldtext]
denen ich nicht möchte, dass sie ausgeführt werden.
\ b in regulären Ausdrücken stimmen mit Wortgrenzen überein (dh der Position zwischen dem ersten Wortzeichen und dem Nichtwortzeichen):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
den Tag zu retten :)Unter Mac OS X funktioniert keine dieser Regex-Syntaxen in sed, um ganze Wörter abzugleichen
\bmyWord\b
\<myWord\>
Hören Sie mich jetzt und glauben Sie mir später, diese hässliche Syntax ist das, was Sie verwenden müssen:
/[[:<:]]myWord[[:>:]]/
So zum Beispiel ersetzen Minze mit minzig für nur ganze Worte:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Quelle: Manpage re_format
quelle
sed
(und jedes andere GNU-Tool) über MacPorts oder Homebrew und stellen Sie sicher, dass es bei Ihnen an erster Stelle stehtPATH
. Es ist möglich, einen Mac ziemlich benutzerfreundlich zu machen.brew install coreutils
, welches alle Gnu-Tools vorangestellt hat.brew install gnu-sed
zu verwendengsed
perl -pe 's|\bone\b|two|g'
. Funktioniert stabil, während sed hier und da versagt.Verwendung
\b
für Wortgrenzen:quelle
[]
:o,l
->[newtext],[newtext]
. Sie meinten offensichtlichsed -i 's/\boldtext\b/newtext/g'
In einer meiner Maschinen funktionierte das Abgrenzen des Wortes mit "
\b
" (ohne Anführungszeichen) nicht. Die Lösung bestand darin, "\<
" zum Starten des Trennzeichens und "\>
" zum Beenden des Trennzeichens zu verwenden.Um es mit Joakim Lundbergs Beispiel zu erklären :
quelle
im Shell-Befehl:
oder:
aber wenn Sie in vim sind, können Sie nur das spätere verwenden:
quelle
quelle
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
gibtno bar embarassment$
.