
Wie ersetze ich die folgende Zeichenfolge
hd_ma_prod_customer_ro:*:123456789:john.doe
mit john.doe
Grundsätzlich muss ich nach dem letzten Doppelpunkt (:) suchen und alles davor und einschließlich ihm löschen.
Antwort1
Angenommen, Sie meinen tatsächlich, dass Sie alles bis zum letzten Doppelpunkt löschen und das john.doe
Folgende unverändert lassen möchten:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Erläuterung:
Die erste Zeile leitet die Testzeichenfolge einfach zu sed
Beispielzwecken weiter.
Das Zweite ist ein grundlegendessed
Auswechslung. Der Teil zwischen dem ersten und zweiten /
ist der zu suchende reguläre Ausdruck und der Teil zwischen dem zweiten und dritten ist das, wodurch er ersetzt werden soll (in diesem Fall nichts, da wir löschen).
Für den regulären Ausdruck gilt: .
Entspricht jedem Zeichen, *
wiederholt dies beliebig oft (einschließlich Null) und :
entspricht einem Doppelpunkt. Es ist also effektiv alles, worauf ein Doppelpunkt folgt. Da .*
ein Doppelpunkt enthalten sein kann, ist die Übereinstimmung „gierig“ und alles bis zum letzten Doppelpunkt wird eingeschlossen.
Antwort2
Eine andere Methode mit awk
:
awk -F: '{ print $NF }'
Antwort3
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Ich ersetze alle Vorkommen von:mit einemTabund verwenden Sie dann, awk
um die Zeichenfolge john.doe zu extrahieren.
Wenn Sie keine Datei haben, können Sie Folgendes versuchen.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Gemäß den Kommentaren von Graeme können wir die letzte Spalte allein mit der folgenden Variable awk
ausdrucken .NF
awk
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Die Einbeziehung von Graemes Kommentaren, um unnötigesed
Der Befehl kann wie folgt geändert werden.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Antwort4
Bitte versuche
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
und zu löschen
echo 'abc:fjk' |sed 's/.*://g'