Egrep für Zeit im H: MM: SS-Format

489
Serg12

Wenn Sie an der Datei arbeiten, müssen Sie die Zeile mit einem Zeitstempel im Format H: MM: SS formatieren. Ich habe folgendes egrep '[0-9] ausprobiert: [0-9]: [0-9]'. Hat nicht für mich gearbeitet. Was mache ich falsch in Regex?

0
Können Sie ein Beispiel für die Datei angeben, für die Sie diese Datei ausführen, was Sie erwarten und was Sie stattdessen erhalten? Es ist viel einfacher, einen Regex zu diagnostizieren, wenn wir die Daten sehen und Ihre Erwartungen verstehen. MaQleod vor 10 Jahren 0

3 Antworten auf die Frage

3
Sirius_Black

wenn Sie für
00:00:00 bis 23:59:59 eine Übereinstimmung erzielen möchten

egrep '([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'t 

wenn Sie von
12.00 bis 12.59 Uhr passen möchten

egrep -i '((?:0[0-9]|1[012]):[0-5][0-9]:[0-5][0-9]\s?(?:a|p)m)' 
Für die zweite ändern Sie "[0-1] [0-2]" in "(0 [0-9] | 1 [012]", wodurch die Randfälle von Zeiten> "12:00:00" eingeführt werden. glenn jackman vor 10 Jahren 0
In der Tat [0-1] [0-2] wird für 00 bis 12 passen, da [0-1] für 0 oder 1 und nicht für beide gilt und [0-2] für 0 oder 2 und nicht für beide. 0-1] [0-2] entspricht [0-1] -> 0 [0-2] -> 0 = 00:00:00 oder [0-1] -> 1 [0-2] -> 2 = 12:00:00 Sirius_Black vor 10 Jahren 0
Nun, passt diese Regex 03:00:00 Uhr? glenn jackman vor 10 Jahren 0
@glennjackman Entschuldigung, ich habe herausgefunden, dass der Fehler, Danke für das Erkennen Sirius_Black vor 10 Jahren 0
0
Azz

[0-9]:[0-9]:[0-9] würde mit H: M: S übereinstimmen, bot nicht H: MM: SS.

Jeder Satz von eckigen Klammern entspricht einem einzelnen Zeichen.

Um etwas zu bekommen, das zu H: MM: SS passt, könnten Sie Folgendes verwenden:

[0-9]:[0-9][0-9]:[0-9][0-9]

Beachten Sie, dass die obigen Punkte NICHT mit H: M: S übereinstimmen

Um mit H: MM: SS ODER H: M: S ODER H: M: SS ODER H: MM: S übereinzustimmen, verwenden Sie Folgendes

[0-9]:[0-9]+:[0-9]+

+ bedeutet, dass das letzte Zeichen mindestens ein Mal (einschließlich der ersten Übereinstimmung) übereinstimmt

Tut mir leid, aber soweit ich mich erinnere, stimmt '.' Mit JEDEM Charakter überein. Nicht das letzte Mal wieder. Das bedeutet, dass "[0-9]." Zu "5a" und "7-" und auch zu "33" passt. Und Sie brauchen nicht zu entkommen von `:` (es hat keine Regex-Bedeutung). Deshalb: Ihre Antwort ist nicht korrekt. erik vor 10 Jahren 0
Mein Fehler! Sie sind richtig, Sir. Jetzt bearbeiten ... Gibt es kein Wiederholungssymbol, das nur einmal wiederholt werden darf? (Ich kann keinen finden, also denke ich, der beste Weg ist: [0-9]: [0-9] [0-9]: [0-9] [0-9] ` Azz vor 10 Jahren 0
Ich kenne kein Wiederholungssymbol (das ist nicht vim). Ich verwende , um eine bestimmte 'NUMBER' von Wiederholungen anzufordern, siehe meine Antwort. erik vor 10 Jahren 0
0
erik

Ich schlage vor, Sie verwenden

egrep '[0-9]:[0-9]:[0-9]' 

Dabei bedeutet das letzte Zeichen mindestens zweimal und maximal zweimal (= genau zweimal), wobei das letzte Zeichen in diesem Beispiel eine Zahl zwischen 0 und 9 war.

Wenn Sie danach mindestens eine und maximal zwei suchen möchten, müssen Sie es in ändern

egrep '[0-9]:[0-9]:[0-9]' 

welche zum Beispiel auf 0:1:22und 0:11:22und 00:11:22und 00:11:2und so weiter passt .

Die Antwort, die Sirius_Black gab, ist auch ein Test auf reale Zeiten. Meine Antwort würde für unrealistische Zeiten wie 99:99:99 passen - was jedoch eine Zeitdauer sein könnte.