it-swarm.com.de

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

31
yihyoon

Angenommen, Sie meinen tatsächlich, dass Sie alles bis zum letzten Doppelpunkt löschen und den john.doe Intakt lassen möchten:

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

Erläuterung:

In der ersten Zeile wird die Testzeichenfolge beispielsweise nur an sed weitergeleitet.

Die zweite ist eine grundlegende sed Substitution . Der Teil zwischen dem ersten und dem zweiten / Ist die Regex, nach der gesucht werden soll, und der Teil zwischen dem zweiten und dem dritten ist der, durch den er ersetzt werden soll (in diesem Fall nichts, wenn wir löschen).

Für den regulären Ausdruck stimmt . Mit einem beliebigen Zeichen überein, * Wiederholt dies beliebig oft (einschließlich Null) und : Stimmt mit einem Doppelpunkt überein. So effektiv ist es alles, worauf ein Doppelpunkt folgt. Da .* Einen Doppelpunkt enthalten kann, ist die Übereinstimmung "gierig" und alles bis zum letzten Doppelpunkt ist enthalten.

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

Ich ersetze alle Vorkommen von : durch ein tab und verwende dann awk, um den String 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äß den Kommentaren von Graeme können wir awk verwenden, um die letzte Spalte allein mit der Variablen NF von awk wie unten zu drucken.

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

Einbeziehen von Graemes Kommentaren, um unnötige sed zu beseitigen

Der Befehl kann wie folgt geändert werden.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
7
Ramesh

Eine andere Methode mit awk:

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

Bitte versuche

bearbeiten: Anker entfernt

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

und zu löschen

echo 'abc:fjk' |sed 's/.*://g'
2
akash