sed ganzes Wort suchen und ersetzen

120

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.

ksuralta
quelle

Antworten:

164

\ 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
Joakim Lundborg
quelle
9
nicht posix | GNU sed OK
Oleg Mazko
@OlegMazko Ich habe auch nach der akzeptablen Posix-Methode für vim gesucht und was für mich funktioniert hat, war s / \ <7 // g. Ich habe versucht, eine 7 am Anfang eines Wortes in meinem Code zu entfernen. Dieser Link, insbesondere die Lösung von JP, führte mich zu der Antwort: stackoverflow.com/questions/3864467/… (aus irgendeinem Grund konnte kein Abschlag zum Einbetten wie bei Ihnen erhalten werden).
Jimh
Vielen Dank, dass ich verrückt geworden bin, als ich versucht habe, das Wort "und" zu ersetzen, um \band\bden Tag zu retten :)
MitchellK
144

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

Larry Gerndt
quelle
19
Installieren Sie einfach GNU 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.
Jim Stewart
9
@JimStewart ist eine großartige Möglichkeit, eine Reihe von Tools zu brechen, die davon ausgehen, dass Sie unter OS X die OS Xer verwenden. Das heißt, ich kann definitiv vorschlagen brew install coreutils, welches alle Gnu-Tools vorangestellt hat.
ELLIOTTCABLE
16
brew install gnu-sedzu verwendengsed
k107
Coreutils zu brauen ist großartig. Gibt es andere Brew-Pakete, die eine ganze Reihe von Gnu-Versionen von Befehlen installieren, oder muss ich den Rest einzeln installieren?
ckot
2
Die Verwendung von Perl ist immer eine bessere Lösung : perl -pe 's|\bone\b|two|g'. Funktioniert stabil, während sed hier und da versagt.
Pavel Vlasov
13

Verwendung \bfür Wortgrenzen:

sed -i 's/\boldtext\b/newtext/g' <file>
Mitch Wheat
quelle
3
Seien Sie vorsichtig mit []: o,l-> [newtext],[newtext]. Sie meinten offensichtlich sed -i 's/\boldtext\b/newtext/g'
JJoao
7

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
Arun
quelle
2

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
Arganzheng
quelle
-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
Ghostdog74
quelle
OP sagt ausdrücklich "using sed"
ndemou
Dies ist ein Split-Manipulate-Join, kein reiner Ersatz. Dadurch werden mehrere Leerzeichen zu einem zusammengefasst und alle führenden / nachfolgenden Leerzeichen verworfen: z . B. echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Egibt no bar embarassment$.
Musiphil