2017-06-08 1 views
-2

Also habe ich eine JSON-Datei von Xml konvertiert. Ich versuche, jq in einem Bash-Skript zu verwenden, um dieses Problem zu lösen.Ich war in dieser Zeit

Strom auf der Kommandozeile jq -r '.users.user[0].id."#text"' cosmology18.json funktioniert gut und zeigt die Ausgabe perfekt

jedoch in bash i Ersetzungen verwenden haben mußte, um zu versuchen dies ohne Entschlossenheit zur Arbeit zu kommen.

erstes bekam ich einen Teil davon, den ersten Teil arbeiten Benutzerdaten

baselineresult=$(jq -r '.users.user[1].cpid."#text"' $1) 

würde mir erlauben, ein Echo aus den empfangenen Daten perfekt

jedoch zu lesen, wenn ich versuche, $basecount hinzuzufügen, die jeweils erhöht Zeit, ich konnte es nicht zur Arbeit bringen, also habe ich diese verrückte Methode konstruiert, in der ich Substitutionen verwenden musste, um den $ basecount in den [] des Benutzers zu bekommen.

bracea="[" 
    braceb="]" 
    dquote='"' 
    squote="'" 
    pound="#" 
    echo test of command is jq -r "${squote}.users.user${bracea}${basecount}${braceb}.cpid.${dquote}#text${dquote}${squote} $1" 

    baselineresult=$(jq -r "${squote}.users.user${bracea}${basecount}${braceb}.cpid.${dquote}${pound}text${dquote}${squote} $1") 
    echo $baselineresult 

Der Befehl stimmt mit dem Befehl überein, den ich an der Befehlszeile eingegeben habe.

aber ich diese:

Test des Befehls ist jq -r '.users.user [0] .cpid "# text".' Cosmology18.json jq: Fehler: Syntaxfehler, unerwarteter INVALID_CHARACTER, '.users.user [0] .cpid "# text"' cosmology18.json jq: $ Ende (? Unix-Shell unter Angabe Ausgaben) in Zeile 1 erwartet 1 Kompilierungsfehler

irgendwelche Ideen .. gewesen jetzt seit 8 Stunden. Ich kann nicht scheinen, dieses unzulässige Zeichen zu finden, da die Ausgabe identisch mit der ID ist, die an der Befehlszeile von jq -r '.users.user [0] .id. "# Text"' verwendet wird. Cosmology18.json

+0

sorry ich ein Echo über Echotest der Befehls typoed ist jq -r „$ {} squote .users.user $ {bracea} $ {basecount} $ {braceb } .cpid.$ {dquote} $ {pound} Text $ {dquote} $ {square} $ 1 "auch ich habe versucht, auch ohne alle Untertitel und immer noch eine verdammt gute Zeit für den jq zu akzeptieren, was Bash es geschickt hat, was richtig ausgibt . so dass wir nicht bash aber mit jq –

+0

somethign können Sie diese Zeile reparieren „erste bekam ich einen Teil davon, den ersten Teil zu arbeiten Benutzerdaten zu lesen?“ –

+0

können Sie erklären, was Sie das Skript, vielleicht in Pseudo-Code zu tun? –

Antwort

0

Das Problem ist, dass Sie nicht wissen, was bash Syntax ist und was jq Syntax ist, so dass Sie beide zusammen zusammenführen.

Hier ist ein Beispiel dafür, was jq erwartet:

.users.user[1].cpid."#text" 

Hier ist, was Sie es sind zu geben:

'.users.user[1].cpid."#text"' filename 

jq wird nie ‚in Ihren Arbeits Befehl sie die einfachen Anführungszeichen, um zu sehen, soll re Bash-Syntax, um anzugeben, welche Zeichenfolge an jq übergeben werden soll. Stattdessen versuchen Sie, jq einfache Anführungszeichen zu geben, die keine Ahnung haben, was das bedeutet.

In ähnlicher Weise ist das Leerzeichen gefolgt von dem Dateinamen Bash-Syntax, um anzugeben, dass Sie ein zweites Argument übergeben möchten. Stattdessen versuchen Sie, sie jq in ihrem ersten Argument zu geben, das sie nicht erwartet.

Zu jq, dieser Befehl ist nicht von Ihrem Original zu unterscheiden (es führt zu einem execve Aufruf mit genau den gleichen Parametern). Sie können die Variable variieren, um verschiedene Indizes zu erhalten:

var=1 
baselineresult=$(jq -r '.users.user['"$var"'].cpid."#text"' "$1") 
+0

root @ iFoggz-s1: ~/Downloads/Snapshots/konvertiert # jq - r '.users.user [0] .cpid. "# text"' kosm ogy18.json e64c6f0a50af958349a03ee08ab178f7 ist, was ID in Terminal bekommen, aber ich werde versuchen, damit zu den Beispielen zu basteln, die Sie gezeigt haben –

+0

Ihr Recht entfernte ich die $ {squette} aka 'und es funktionierte. Vielen Dank, ich bin sicher, dass 95% meiner Haare übrig sind! –

Verwandte Themen