![Verwenden Sie sed, um ganze Wörter zu finden und zu ersetzen](https://rvso.com/image/31683/Verwenden%20Sie%20sed%2C%20um%20ganze%20W%C3%B6rter%20zu%20finden%20und%20zu%20ersetzen.png)
Ich habe den folgenden Textblock in einer Datei:
test3.legacy test4.legacy test3 test3.kami
test3
Ich möchte nur als Ganzes suchen und es durch nichts ersetzen. Leider haben alle meine Versuche entfernttest3von test3.legacy
und 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, \s
anstatt 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
test3
am Zeilenanfang und Zeilenende nicht extra darauf achten zu müssen, - Ersetzen Sie
test3
die in Leerzeichen eingeschlossenen Elemente durch ein einzelnes Leerzeichen. - Wiederholen Sie den Vorgang, solange es Ersetzungen gibt (um die
test3 test3
Fä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