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
maihabunash
quelle

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
jimmij
quelle
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.
27

Sie können dies auch mit der Erweiterung der Bash-Parameter handhaben :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Ausgabe:

swp-RedHat-Linux-OS-5.5.0.0 03
Thor
quelle
Sehr kreativ, liebe diese Antwort
dpritch
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
Rahul
quelle
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