JSON mit BusyBox-Tools analysieren

JSON mit BusyBox-Tools analysieren

Ich habe ein POSIX-kompatibles Installationsskript, das die neueste Version einer Software ermittelt, indem es Informationen aus einem JSON-Blob ausliest, der aus einer Softwareregistrierung abgerufen wurde:

meta=$(wget -qO - https://registry.npmjs.org/after-dark/latest)
grep --version | grep "BSD grep" 1>/dev/null && vers=$(echo "$meta" | grep -oE '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
grep --version | grep "GNU grep" 1>/dev/null && vers=$(echo "$meta" | grep -oP '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')

Ich muss diese Software mit BusyBox kompatibel machen, das wie BSD grep erweiterte Regex-Unterstützung bietet . Flag -Ewird jedoch nicht unterstützt .--version

Wenn ich es ausführe, busybox grepwird mir die Version von Busybox angezeigt. Soll ich diese einfach verwenden, um die Kompatibilität zu erhöhen? Gibt es eine bessere Möglichkeit, den Codegeruch zu entfernen, ohne Abhängigkeiten zu installieren?

Antwort1

Ich konnte nicht länger warten, also habe ich mir die Sache noch einmal genauer angesehen und bin auf die folgende Lösung gekommen, die in Tests mit GNU, BSD und BusyBox grep gute Ergebnisse lieferte und die Unterstützung für semver verbessert:

egrep -o "\"version\".*[^,]*," <<< "$meta" | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" '

Dies funktioniert durch den Aufruf von ERE grep mitein regulärer Ausdruck(mit einemHutspitze) und verwendet, cutum das nachstehende Komma abzuschneiden, alles auf der rechten Seite des zu erfassen :, die Zeichenfolge zu kürzen und alle vorhandenen Anführungszeichen zu entfernen.

Bei einer Angabe $metavon {"version":"5.5.0-beta4",}wird genau zurückgegeben 5.5.0-beta4.
Bei einer Angabe $metavon "version" : 1,wird genau zurückgegeben 1.

Nimmt an, dass versiondas Feld nicht das letzte Feld im JSON-Blob ist, was auf Kosten der Lesbarkeit geht.

Angewandt auf die ursprüngliche Frage ergibt sich:

vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')

Dadurch ist es nicht mehr nötig, die Version von grep zu erkennen und der Code-Geruch wird beseitigt.

AKTUALISIEREN:

Schließlich gelangte ich zu einemelegantere LösungVerwendung sedin einemZusatzfrageauf SO.

verwandte Informationen