2016-10-04 4 views
0

Ich muss alle Zeichen aus einer Zeile entfernen und nur die Stunde drinnen nehmen. Die Linien sind wie folgt aus:Regex mit Sed "sauber" eine XML-Zeile

<msg timestamp="20161004 16:24:56.638" level="INFO">Set BAT with value 1</msg> 

und ich brauche dieses Ergebnis:

16:24:56.638 

ich das versucht:

cat output.xml | grep -E "Set BAT with value 1" | sed 's/^<msg timestamp 
=\"[0-9]+\s([0-9]+):?\.?\".+/{1}/g' 

Aber jetzt scheint mir unmöglich, das richtige Ergebnis zu erhalten. Jemand?

Danke !!

+3

Es ist besser, 'grep' oder' sed' nicht zu verwenden, um XML zu analysieren. – anubhava

Antwort

1

mit grep und pcre, unter der Annahme, <msg> Tags Linie in derselben Zeile

$ grep -oP '(\d+:){2}[\d.]+(?=.*Set BAT with value 1)' output.xml 
16:24:56.638 
  • (\d+:){2}[\d.]+ Muster gut bis
  • (?=.*Set BAT with value 1) positive Vorschau zu extrahieren, um zu sehen, ob Zeile enthält Set BAT with value 1


mit sed

$ sed -nE '/Set BAT with value 1/ s/.* (([0-9]+:){2}[0-9.]+).*/\1/p' output.xml 
16:24:56.638 

diese Lösung hat den Vorteil über grep, dass es Inplace Editing machen können.