2016-11-11 3 views
0

Ich möchte etwas dynamischen Text aus der Protokolldatei entfernen. Ich bin in der Lage, es mit regex und grep -oP zu extrahieren, funktioniert jedoch die gleiche Regex nicht mit sed Befehl.Verwendung von Regex mit sed Suche und Ersetzen

Beispieldaten: (zum Lesen Bequemlichkeit Concerned Daten zwischen ABCDEF und LMNOP nur)

XXX 2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]: ABCDEF[XXXX]: 1472846015.555671: LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX 

Folgenden sehen Sie die Daten, die ich aus der Protokolldatei entfernen möchten. Ich bin in der Lage, es zu extrahieren regex + grep:

grep -Po ']: [0-9]{10}\.[0-9]{6}:' sample 
]: 1472846015.555671: 

Nun, wenn ich die gleiche Regex mit sed Befehl verwenden, es ist nicht helping.Any Vorschläge?

Ich habe den folgenden Befehl mit sed verwendet und es gab mir die unveränderte Datei zurück.

sed "s/]: [0-9]{10}\.[0-9]{6}://" input 

oder

awk '{gsub(/]: [0-9]{10}\.[0-9]{6}:/,"")}1' input 

ich folgende Ausgabe muß:

XXX 2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]: ABCDEF[XXXX LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX 

oder noch besser:

XXX 2 13:53:35 XXXX0-0-0 XXXXXXXX[3513]: ABCDEF[XXXX]::LMNOP(79): XXXXXXXXXXXXX - XXXXXX XX XXX XXX XXXXX XX XXXXX XXXX XXX XXXX XXX 

Antwort

2

In der sed Verwendung:

sed "s/]: [0-9]\{10\}\.[0-9]\{6\}: /]::/" input 

# 1 der "s/# 1/# 2 /" Befehl searchs für das Muster, aber Sie müssen geschweifte Klammern (\{ und \}) entkommen. Dann ersetzen Sie es zu # 2, die ]: rückwärts hinzufügen wird, weil es im Suchmuster ist. Wenn Sie :: benötigen, fügen Sie es wie oben in das Ersetzungsmuster ein.

Aber vielleicht brauchen Sie nicht ]: suchen und zu ersetzen, nur Ziffern zu ersetzen und zu : mit Befehl dot (es funktioniert für Ihr Beispiel)

sed "s/ [0-9]\{10\}\.[0-9]\{6\}: /:/" input 
1

Sie können wählen, mit erweiterten regex sed zu verwenden. Beachten Sie jedoch, dass der erweiterte Regex eine GNU-Erweiterung ist und daher möglicherweise nicht tragbar ist. Hier ist das gleiche sed wie von @Konstantin Morenko vorgeschlagen, aber ohne die Backslashes für die { und }. Erweiterte Regex-Option ist -r oder --regexp-extended

sed -r "s/ [0-9]{10}\.[0-9]{6}: /:/" input