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.

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


@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


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>

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

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

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.