2017-08-09 1 views
2

Ich versuche sed um>09 Aug 2017 14:15:11 aus der Zeichenfolge folgende Ausgabe zu erhalten zu verwenden, die 09/Aug/2017:14:15:11sed regex Erfassungsgruppe gesamten Eingangs ausgibt

wie diese aussieht, wenn ich folgenden Code verwenden

sed 's/^\(\d+\)\/\(\w+\)\/\(\d+\)\:\(.*\)$/\1 /p' <(echo "09/Aug/2017:14:15:11") 

ich ganzes Eingabestring als Ausgang: 09/Aug/2017:14:15:11

im dies zu tun, um date -d Befehl auszuführen auf das Ergebnis seit date -d 09/Aug/2017:14:15:11 +%s gibt mir diesen Fehler: date: invalid date ‘09/Aug/2017:14:15:11’. Wenn Sie andere Vorschläge als sed haben, zögern Sie nicht, einen Vorschlag zu machen.

Danke!

Antwort

2

Mit sed:

$ echo "09/Aug/2017:14:15:11" | sed -e 's#/# #g' -e 's/:/ /' 
09 Aug 2017 14:15:11 

Wir verwenden zwei search and replace Befehle hier, einen Lauf nach dem anderen. Die erste, die alle ersetzt (beachten Sie die globale Flagge, g) Schrägstriche mit Leerzeichen (/), und die zweite, nur den ersten Doppelpunkt zu ersetzen (:) (beachten Sie die fehlende g Flag). Beide sind Such- und Ersetzungsbefehle (s), aber die erste verwendet # als Trennzeichen anstelle des Standards /, so dass wir dem Schrägstrich, den wir suchen, nicht entkommen müssen.

+0

Wow, vielen Dank, das hilft wirklich! Könntest du zufällig erklären, wie diese Ausdrücke '-es #/# #g '-e's /://' genau funktionieren? @randomir * bearbeiten * nur aktualisiert und notiert Ihre Bearbeitung, danke, erstaunlich! –

+0

Ich habe die Erklärung ein wenig erweitert. Ist es jetzt klarer? – randomir

+0

ganz sicher, kurz und direkt auf den Punkt, danke! :) –

1

Ich denke Befehl unten besser ist:

date "+%d %h %Y %H:%M:%S" 
+0

Das OP möchte eine vorhandene Datumszeichenkette * nicht * umwandeln, um das aktuelle Datum in einem bestimmten Format zu drucken. – randomir