Wie verwende ich Sed, um alle Zeichen vor dem Doppelpunkt zu ersetzen?

Wie verwende ich Sed, um alle Zeichen vor dem Doppelpunkt zu ersetzen?

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.doeFolgende 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 sedBeispielzwecken weiter.

Das Zweite ist ein grundlegendessedAuswechslung. 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, awkum 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 awkausdrucken .NFawk

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'

verwandte Informationen