2017-05-06 4 views
1

ich das Datum Teil in Klammern mit sed extrahieren möchten:sed: wie ein Teil einer Linie zu extrahieren enthält Kolon

# Equ_time = 959240309.430000 (26-May-2015 07:38:29) 

Ich benutze diesen Code:

sed -n 's:# Equ_time = [0-9]*.[0-9]* .\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9]*\).*:\1:p' file.txt 

aber es gibt:

Ich denke, das Problem bezieht sich auf Doppelpunkt im Zeitabschnitt, wie sollte ich den Befehl ändern, um gut zu funktionieren?

Antwort

2

ändern es zu

sed -n 's:# Equ_time = [0-9]*.[0-9]* .\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9:]*\).*:\1:p' file.txt 

Hinweis habe ich einen Doppelpunkt in der letzten [0-9:]*. Der Fehler war, weil Sie hatte keinen Doppelpunkt in Ihrer regex Suche

+0

Danke, aber würden Sie mir bitte sagen, was bedeutet, dass Doppelpunkt Sie tun hinzugefügt? – gnome

+0

Der Zeitteil Ihres Textes '07: 38: 29' enthält einen Doppelpunkt. Sie müssen Ihre Regex auch nach einem Doppelpunkt suchen. Daher wurde der Doppelpunkt im Code hinzugefügt. – gaganshera

+0

OK, aber warum haben Sie nur einen Doppelpunkt im letzten Teil hinzugefügt, der mit dem zweiten Teil des Zeitabschnitts zusammenhängt? Warum haben Sie nicht rechtzeitig den Doppelpunkt zu den Teilen hinzugefügt, die Doppelpunkte (Trennzeichen) darstellen? – gnome

2

enthalten Ist dies nicht alles, was Sie brauchen:

$ awk -F'[ (]' '{print $8}' file 
26-May-2015 

dann Ihre Frage bearbeiten Ihre Anforderungen zu klären und mehr wirklich repräsentative Probe Input liefern . Gerade jetzt haben Sie einen sehr komplizierten Ansatz, der auf jeden Fall nicht notwendig ist, wie Sie eine robustere Spiel tun könnte mehr einfach mit:

$ sed -n 's:# Equ_time = [0-9]*\.[0-9]* .\([^ ]*\).*:\1:p' file 
26-May-2015 

aber das ist wahrscheinlich nicht einmal notwendig, entweder ohne eine bessere Probeneingabe und der damit verbundenen Ausgabe, es ist schwer zu erraten bei dem, was der richtige Ansatz ist.

0

Betrachten Sie die markierten Teile in Ihrer Eingabezeichenfolge und das Muster:

# Equ_time = 959240309.430000 (26-May-2015 07:38:29) 
            ^^^ 

.\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9]*\) 
      ^^^^^ 

Die Zeichenklasse [A-Z] nur Großbuchstaben übereinstimmen, nicht Klein diejenigen. (im C-Gebietsschema, das heißt: in anderen Gebietsschemas könnte es fast alles zusammenpassen.) So wird dieser Teil genau einmal übereinstimmen (gegen die M), und die a und y werden durch die folgenden Punkte übereinstimmen. Da Sie die tatsächlichen Trennzeichen (- und :) nicht buchstabiert haben und [0-9]* anstelle von [0-9]+ verwendet haben, stimmt der Rest des Musters teilweise überein.

würde ich Ihr kondensieren zu so etwas wie dieses sed, wenn Sie nicht allzu besorgt sind über das genaue Format passend:

sed -nEe 's/^# Equ_time *=[0-9. ]*\((.*)\).*/\1/p' 

oder, wenn Sie möchten, den inneren Teil zu einem Zeichen abgestimmt, dann

([0-9]+-[A-Za-z]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+) 

(beachten Sie, dass ich erweiterte reguläre Ausdrücke dort verwendet)

Verwandte Themen