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

25

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 vorher und einschließlich löschen.

yihyoon
quelle

Antworten:

40

Angenommen, Sie meinen tatsächlich, Sie möchten alles bis zum letzten Doppelpunkt löschen und das john.doeGanze intakt lassen:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Erläuterung:

Die erste Zeile leitet den Teststring nur zu sedBeispielzwecken weiter.

Der zweite ist eine grundlegende sedSubstitution . Der Teil zwischen dem ersten und dem zweiten /ist der zu suchende reguläre Ausdruck und der Teil zwischen dem zweiten und dem dritten ist das, durch das er ersetzt werden soll (in diesem Fall nichts, während wir löschen).

Stimmt für die Regex .mit einem beliebigen Zeichen überein, *wiederholt dies beliebig oft (einschließlich Null) und :stimmt mit einem Doppelpunkt überein. So effektiv ist es alles, was von einem Doppelpunkt gefolgt wird. Da .*ein Doppelpunkt enthalten sein kann, ist die Übereinstimmung "gierig" und alles bis zum letzten Doppelpunkt ist enthalten.

Graeme
quelle
7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Ich ersetze alle Vorkommen von : mit einem Tabulator und benutze dann awk, um die Zeichenfolge john.doe zu extrahieren.

Wenn Sie keine Datei haben, können Sie dies versuchen.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Gemäß Graemes Kommentaren können wir nur awkdie letzte Spalte mit der NFVariablen awkwie unten drucken .

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Einbeziehung von Graemes Kommentaren, um unnötiges loszuwerden sed

Der Befehl kann wie folgt geändert werden.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Ramesh
quelle
1
Wenn Sie verwenden möchten awk, warum nicht einfach awk -F:?
Graeme
@Graeme, ich fühle mich immer noch nicht so wohl mit awk. Grundsätzlich versuche ich, die Befehle, die ich ursprünglich in meiner Antwort erhalten habe, zu testen und sie gemäß den Anforderungen des Benutzers zu ändern. :)
Ramesh
3
Die -FOption für awkgibt das Feldtrennzeichen an. Wenn Sie awkeinen Doppelpunkt verwenden möchten, müssen Sie die Doppelpunkte nicht durch Tabulatoren ersetzen. Wenn Sie das letzte Feld abrufen möchten, das Sie $NFstattdessen verwenden können $4, funktioniert dies auch, wenn nicht immer drei Doppelpunkte vorhanden sind.
Graeme
@Graeme, ich habe die von Ihnen erwähnten Änderungen übernommen. Bitte lassen Sie mich wissen, ob dies in Ordnung ist :)
Ramesh
Ja, funktioniert einwandfrei!
Graeme
6

Eine andere Methode mit awk:

awk -F: '{ print $NF }'
Chris Down
quelle
2

Bitte versuche

Bearbeiten: Anker entfernt

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

und zu löschen

echo 'abc:fjk' |sed 's/.*://g'
akash
quelle
darum bittet das OP nicht
iruvar
Bitte lesen Sie die Frage erneut.
Akash
Nun, Sie haben sich nach meinem Kommentar in die Löschung geschlichen,
egal
Oh, ich verstehe. Entschuldigung 1_CR
akash
1
Der ^Anker macht weder im Fall der Frage noch in Ihrem Beispielsfall einen Unterschied. Jede Adresse, die mit beginnt, /.*impliziert bereits die ^.
mikeserv