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 -E
wird jedoch nicht unterstützt .--version
Wenn ich es ausführe, busybox grep
wird 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, cut
um 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 $meta
von {"version":"5.5.0-beta4",}
wird genau zurückgegeben 5.5.0-beta4
.
Bei einer Angabe $meta
von "version" : 1,
wird genau zurückgegeben 1
.
Nimmt an, dass version
das 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 sed
in einemZusatzfrageauf SO.