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.
Angenommen, Sie meinen tatsächlich, Sie möchten alles bis zum letzten Doppelpunkt löschen und das john.doe
Ganze intakt lassen:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Die erste Zeile leitet den Teststring nur zu sed
Beispielzwecken weiter.
Der zweite ist eine grundlegende sed
Substitution . 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.
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 awk
die letzte Spalte mit der NF
Variablen awk
wie 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}'
awk
, warum nicht einfachawk -F:
?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. :)-F
Option fürawk
gibt das Feldtrennzeichen an. Wenn Sieawk
einen Doppelpunkt verwenden möchten, müssen Sie die Doppelpunkte nicht durch Tabulatoren ersetzen. Wenn Sie das letzte Feld abrufen möchten, das Sie$NF
stattdessen verwenden können$4
, funktioniert dies auch, wenn nicht immer drei Doppelpunkte vorhanden sind.Eine andere Methode mit
awk
:quelle
Bitte versuche
Bearbeiten: Anker entfernt
und zu löschen
quelle
^
Anker macht weder im Fall der Frage noch in Ihrem Beispielsfall einen Unterschied. Jede Adresse, die mit beginnt,/.*
impliziert bereits die^
.