Wie ersetze ich das letzte Vorkommen eines Zeichens in einer Zeichenfolge mit sed?


31

Wie ersetze ich nur das letzte Vorkommen von "-" in einer Zeichenfolge durch ein Leerzeichen sed?

Beispielsweise:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

aber ich möchte die folgende Ausgabe erhalten (Ersetzen des letzten Bindestrichs [“-“] durch ein Leerzeichen)

swp-RedHat-Linux-OS-5.5.0.0 03

Antworten:


48

Du kannst es mit single machen sed:

sed 's/\(.*\)-/\1 /'

oder mit einem erweiterten regulären Ausdruck:

sed -r 's/(.*)-/\1 /'

Der Punkt ist, dass sedes sehr gierig ist, so dass so viele Zeichen -wie möglich vorkommen, einschließlich anderer -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03

2
Beachten Sie, dass dies nicht portabel ist. Einige Nicht-GNU-Versionen von sedunterstützen keine Musterübereinstimmungen. In diesem Fall benötigen Sie etwas anderes, sei es perl -pne 's/(.*)-/$1 /'die Parametererweiterungslösung von @ Thor oder etwas anderes.
Adam Katz

natürlich :-) Danke ...
Greg

Sie sollten diese Klammern nicht umgehen müssen, wenn Sie einfache Anführungszeichen verwenden.
jgmjgm

@jgmjgm Sie können Backslashes auslassen, indem Sie den erweiterten regulären Ausdruck mit verwenden sed -r.
Jimmy

1
@ VinayPotluri Versuchen sed -r 's/(.*)-(.*)-/\1 \2 /').
8.


11

So etwas hat bei mir funktioniert, obwohl ich mir sicher bin, dass es bessere Möglichkeiten gibt

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03

Das ist schlecht ... einfach schlecht. Warum 4 Operationen ausführen, wenn Sie 2 ausführen können?
Joshpbarron

7
Für jemanden mit nur einem Grundverständnis für reguläre Ausdrücke scheint diese Antwort viel zugänglicher zu sein. Und wen kümmert es, wie viele Operationen es braucht, das wird für alle praktischen Fälle augenblicklich sein. Daher würde ich die Lesbarkeit einer beliebigen Regel überlegen, um so wenig Operationen wie möglich zu verwenden.
Psirus

5
@Psirus Ich hoffe, dies wird keine Dose Würmer öffnen, aber die Idee, kleinere Operationen zu verwenden, besteht darin, ein gewisses Maß an Beherrschung der kleineren Operationen zu demonstrieren . Zum Beispiel zeigt die Antwort von @ Thor, dass die bashParametererweiterungsfunktion geschätzt wird, was gut funktioniert, wenn OP ebenfalls verwendet bashwird. Es wird ein empfindliches Gleichgewicht zwischen der Lesbarkeit (bis hin zu einer sehr ausführlichen Darstellung) und der Verwendung der richtigen Werkzeuge geben, doch meistens ist die Verwendung der richtigen Werkzeuge entscheidend.
hjk
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.