Grep-Frage zu OSM History XML

Ich würde gerne den Ersteller einer beliebigen Relation aus dem History-XML ermitteln. Beispielhaft nehme ich die Relation 7129340.

Ich versuche mich an einer Lösung mit grep, allerdings ist auch jede Lösung mit anderen Tools willkommen. Wer Windows benutzt, braucht hier das Linux Subsystem um mitreden zu können.

Herunterladen mit grep + RegExp matchen mit grep:

*curl -s https://www.openstreetmap.org/api/0.6/relation/7129340/history | grep -oP '.version="1".user="(.?)"’

ergibt:

<relation id=“7129340” visible=“true” version=“1” changeset=“47394399” timestamp=“2017-04-02T21:56:12Z” user=“Negjana”

Dabei wollte ich eigentlich nur den Inhalt der 1. Gruppe (.?)* – sprich Negjana – bekommen, weswegen ich extra grep -oP (man) verwendet habe.

Weiß hier ein Unix-Crack weiter?

Osmium Tool mit opl Ausgabeformat ist hier angesagt. Am besten zunächst einen Blick in die Doku werfen, dort gibt es ausreichend viele Beispiele.

Es macht auch wenig Sinn, die komplette History abzufragen, wenn man genauso gut gleich die Version 1 anfordern kann, sogar für mehrere Relationen gleichzeitig.

https://www.openstreetmap.org/api/0.6/relation/7129340/1

Meine Frage zielte aber nicht auf die API, sondern aufs Greppen ab.

Hallo,

grep weiß ja nicht, welchen Teil des Strings es “only matchen” soll, das kann man nur durch weitere greps in der pipe erreichen, wenn man sich auf grep beschränken will. In sed lässt sich die Auswahl der Zeile (version=“1”) und das Filtern einzelner Wörter innerhalb dieser mit “(”, “)” und “\1” besser kombinieren:

curl -s https://www.openstreetmap.org/api/0.6/relation/7129340/history | sed 's/.*version="1".*user="\(.*\)".*/\1/'

Grüße
Mario

Durch das .* vor version und vor user matched die ganze Zeile!
Mit einem nachgeschalteten

| sed s/.*user=// 

kannst Du den ersten Teil der Zeile beseitigen.

Darauf bin ich im ersten Teil meiner Antwort eingegangen! Xml->opl konvertieren und dann Greppen ist viel einfacher als sich direkt mit xml rumzuschlagen.

https://osmcode.org/opl-file-format/#usage-examples

Noch einfacher wird das bald mit JSON gehen:

curl -s https://upload.apis.dev.openstreetmap.org/api/0.6/relations.json?relations=4710v1,4711v1 | jq '.elements[].user'

@mmd: Sorry für meine Blödheit! Du meintest also so etwas:

curl -s https://www.openstreetmap.org/api/0.6/relation/7129340/history/1 | osmium cat -F xml -f opl -o - | grep 'v1.* u() '

Nur das Greppen funktioniert noch nicht.


Leider habe ich noch was: Was mache ich, wenn die 1. Version einer Relation leer ist, wie z.B. https://www.openstreetmap.org/api/0.6/relation/541771/1 ?

Sieht doch schon fast gut aus, das “history” in der URL kann weg, und den " v1 " grep lasse ich auch schon weg (das ist schon über die URL sichergestellt):

curl -s https://www.openstreetmap.org/api/0.6/relation/7129340/1 | ./osmium cat -F xml -f opl -o - | cut -d' ' -f7 | cut -c2-

Diese leeren Versionen entstehen durch Redaction (=Ausblenden von Versionen wg. Copyright Problemen und ähnlichem). Man könnte das über die History lösen und diese nach Erzeugungszeitpunkt aufsteigend sortieren, dann die erste Zeile rausziehen und dort den Bearbeiter ermitteln. Hier im Beispiel ist das der “OSMF Redaction Account”.

curl -s https://www.openstreetmap.org/api/0.6/relation/541771/history | ./osmium cat -F xml -f opl -o - | sort  -t" " -k 5 | head --lines=1 |  cut -d' ' -f7 | cut -c2-