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.