Parsen Sie JSON für ein Array in einem Shell-Skript

8

Ich versuche, ein JSON-Objekt innerhalb eines Shell-Skripts in ein Array zu analysieren.

z. B .: [Amanda, 25, Ссылка

Der JSON sieht folgendermaßen aus:

%Vor%

Ich möchte keine Bibliotheken verwenden, es wäre am besten, wenn ich einen regulären Ausdruck oder grep verwenden könnte. Ich habe es getan:

%Vor%

Das gibt mir "Name": "Amanda". Ich könnte dies in einer Schleife für jede Zeile in der Datei tun und sie zu einem Array hinzufügen, aber ich brauche nur die rechte Seite und nicht die gesamte Zeile.

    
unconditionalcoder 14.07.2016, 01:45
quelle

3 Antworten

14

Wenn Sie wirklich keinen geeigneten JSON-Parser wie jq [1] verwenden können Versuchen Sie eine awk -basierte Lösung :

Bash 4.x:

%Vor%

Bash 3.x:

%Vor%

Dies speichert alle Eigenschaften Werte im Bash-Array ${values[@]} , die Sie mit
declare -p values überprüfen können.

Diese Lösungen haben Einschränkungen:

  • Jede Eigenschaft muss in einer eigenen Zeile stehen,
  • Alle Werte müssen doppelt zitiert werden,
  • eingebettete Escape-Anführungszeichen werden nicht unterstützt.

Alle diese Einschränkungen verstärken die Empfehlung, einen geeigneten JSON-Parser zu verwenden.

Hinweis: Die folgenden alternativen Lösungen verwenden den Befehl Bash 4.x + readarray -t values , sie funktionieren jedoch auch mit der Bash 3.x-Alternative IFS=$'\n' read -d '' -ra values .

grep + cut combination : Ein einzelner Befehl grep reicht nicht aus (außer Sie verwenden GNU grep - siehe unten), aber Hinzufügen von cut hilft:

%Vor%

GNU grep : Verwenden von -P zur Unterstützung von PCREs, die \K unterstützen, um alles zu löschen, was bisher erreicht wurde (eine flexiblere Alternative zu einem hinter Assertion) sowie Look-Ahead-Assertions ( (?=...) ):

%Vor%

Zum Schluss noch eine pure Bash (3.x +) Lösung :

Was macht dies zu einer brauchbaren Alternative in Bezug auf die Leistung ist, dass keine externen Dienstprogramme in jeder Schleifeniteration aufgerufen werden ; Bei größeren Eingabedateien ist eine Lösung, die auf externen Dienstprogrammen basiert, jedoch wesentlich schneller.

%Vor%

[1] Hier sehen Sie, wie eine stabile jq -basierte Lösung aussehen würde (Bash 4.x):
readarray -t values < <(jq -r '.[]' myfile.json)

    
mklement0 14.07.2016, 04:50
quelle
3

jq ist gut genug, um dieses Problem zu lösen

%Vor%

Damit Sie eine Tabelle erhalten, können Sie beliebige Zeilen grep oder awk beliebige Spalten drucken

    
Dr_Hope 25.04.2017 00:33
quelle
0

Sie können einen sed one Liner verwenden, um dies zu erreichen:

%Vor%

Ergebnis:

%Vor%

Wenn Sie die Anführungszeichen nicht benötigen / wollen, dann werden sie durch das folgende sed beseitigt:

%Vor%

Ergebnis:

%Vor%

Es funktioniert auch, wenn Sie mehrere Einträge haben, wie

%Vor%

UPDATE:

Wie von mklement0 in den Kommentaren angegeben, kann ein Problem auftreten, wenn die Datei eingebettete Leerzeichen enthält, z. B. "name" : "Amanda lastname" . In diesem Fall würden Amanda und lastname jeweils in separate Array-Felder gelesen. Um dies zu vermeiden, können Sie readarray , z. B.,

verwenden %Vor%

Dies wird sich auch um alle Probleme kümmern, die auch in den Kommentaren erwähnt werden.

    
nautical 14.07.2016 05:31
quelle

Tags und Links