Ich habe mir nochmal die XML-Dateien angeschaut. Wir haben es hier mit zwei verschiedenen XML-Formaten zu tun. Das legen ja auch die Jahreszahlen nahe, dass die Speicherformate von stark unterschiedlichen Programmversionen stammen.
Die mit der gewünschten Ausgabe sieht so aus:
Die ohne Ausgaben sehen so aus:
D. h. da ist kein expliziter Namespace angegeben.
Einen weiteren Unterschied gibt es noch:
Die Dateien ohne den expliziten "osmand" - Namespace, haben einen default Namespace für die XML-Datei im Header gesetzt:
... und wenn die Namespaces nicht in das XPath-Muster mit einbezogen sind, dann trifft der Ausdruck da genau gar nicht zu!
Dafür gibt's zwei unterschiedliche Lösungswege, je nachdem, ob man mit xmllint oder xmlstarlet arbeitet:
xmlstarlet
Code: Alles auswählen
xmlstarlet sel -N x="http://www.topografix.com/GPX/1/1" -t -v "//x:speed/text()" datei.gpx
Man definiert hier den Namespace mit einer Abkürzung("x") und sucht in dem Namespace dann nach "speed".
xmllint
Code: Alles auswählen
xmllint --xpath "//*[local-name()='speed']/text()" datei.gpx
xmllint kann wohl keine Namespaces definieren. Insofern arbeitet man mit einem Wildcard und dem "local-name", also dem Attributnamen der losgelöst vom Namespace zutreffen kann. Das funktioniert auch für xmlstarlet und ist generisch für alle Fälle unabhängig von den Namespaces.
Das ist dann das aktuelle Script:
Code: Alles auswählen
#!/bin/bash
get_max_speed_from_gpx() {
local filename="$1"
sed -re 's#(<gpx )#\1xmlns:osmand="empty" #i' "$filename" \
| xmlstarlet sel -t -v "//*[local-name()='speed']/text()" - \
| awk '$1 > max {max=$1} END {print max}'
}
while read filename ; do
echo "$filename"
get_max_speed_from_gpx "$filename"
done < <( find . -iname "*.gpx" )
Anmerkung: Quotes um das "*.gpx" haben oben noch gefehlt.
Oder doch lieber quick'n'dirty mit awk (GNU-awk!) ?
Code: Alles auswählen
#!/bin/bash
find . -iname "*.gpx" -exec gawk -v thresh=18 '
match(tolower($0),"speed[\\s>]+(.*)[\\s<]+/speed",m) {
if (m[1]>thresh ){
print FILENAME,m[1];exit}
}' {} \;
Ansonsten ist XML-Verarbeitung mit awk nicht besonders sicher. Wenn z. B. die XML-Datei komprimiert ist, d. h. alles in einer Zeile ohne überflüssigen Whitespace, dann funktioniert das hier mit awk überhaupt nicht. Ein prophylaktischer Pretty-Print vorab wäre grundsätzlich zu empfehlen: