Verwenden Sie sed, um ganze Wörter zu finden und zu ersetzen

Verwenden Sie sed, um ganze Wörter zu finden und zu ersetzen

Ich habe den folgenden Textblock in einer Datei:

test3.legacy test4.legacy test3 test3.kami

test3Ich möchte nur als Ganzes suchen und es durch nichts ersetzen. Leider haben alle meine Versuche entfernttest3von test3.legacyund test3.kami. Ich habe versucht:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

ohne Erfolg. Irgendwelche Ideen, wie ich das lösen kann?

BEARBEITEN:Die meisten Versuche führten zu folgendem Ergebnis:.legacy test4.legacy .kami

Antwort1

Ist das was du willst?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

Das sagt

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

Aktualisieren:

Und wie es der gute Mann so elegant ausdrückte:@Stephane Chazelasdies würde bestimmte Fälle nicht abdecken. Betonen Sie auch den Portabilitätsaspekt. SieheAntwort unten.

Eine GNU-Variante könnte(hoffentlich), Sei:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

sich um sich wiederholende Übereinstimmungen kümmern. Optional würde man sich auch um mehrere Leerzeichen usw. kümmern. Abhängig von der Eingabe.

EOUPD


Als Alternative vielleicht (nur als Ausgangspunkt gedacht):

sed 's/\Wtest3\W/ /g'

Nicht das, nehme ich an:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

Antwort2

In Ihrem Beispiel würde ich nach „test3“ suchen, das auf beiden Seiten mit einem Leerzeichen umschlossen ist, \sanstatt zu versuchen, die Wortgrenzennotation zu verwenden.

Zum Beispiel

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

Das obige sucht nachRaumtest3Raumund ersetzt dies durch nur einRaum.

NOTIZ:Dies behebt nicht die Situation, in der Test3 an erster Stelle in der Liste steht!

Antwort3

Tragbar:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

Das ist:

  • zuerst am Zeilenanfang und Zeilenende ein Leerzeichen einfügen, um test3am Zeilenanfang und Zeilenende nicht extra darauf achten zu müssen,
  • Ersetzen Sie test3die in Leerzeichen eingeschlossenen Elemente durch ein einzelnes Leerzeichen.
  • Wiederholen Sie den Vorgang, solange es Ersetzungen gibt (um die test3 test3Fälle abzudecken).
  • Entfernen Sie die führenden und nachfolgenden Leerzeichen, die wir ursprünglich hinzugefügt haben.

Antwort4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

Bitte versuchen Sie es oben

verwandte Informationen