Antworten:
\ 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
sed
(und jedes andere GNU-Tool) über MacPorts oder Homebrew und stellen Sie sicher, dass es bei Ihnen an erster Stelle steht PATH
. 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:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Sie meinten offensichtlich sed -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 :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
im Shell-Befehl:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
oder:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
aber wenn Sie in vim sind, können Sie nur das spätere verwenden:
:% 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
gibt no bar embarassment$
.