2017-09-06 1 views
1

echo Ich mag würde dies für zwei .json Dateien über die Befehlszeile tun:Linux Katze zwei Dateien als eine

#echo '[' . (cat file1.json) . ',' . (cat file2.json) . ']' 

Aber das ist offensichtlich Pseudo-Code. Wie würde ich das tun?

+0

Verwenden Sie das 'jq (1)' Werkzeug, wenn Sie json lesen/schreiben. Es hat nur minimale Unterstützung für I/O, aber es sollte genug dafür sein. – o11c

+2

Das ist kein gültiger JSON. – SLaks

+1

Auch ich bin mir ziemlich sicher, dass Sie "[" für ein Array meinen, da Sie keine Schlüssel haben. – o11c

Antwort

1
echo "[ $(cat file1.json) , $(cat file2.json) ]" 

funktioniert, solange die Dateien selbst gültig json

+0

Das wird nie gültige JSON –

+0

produzieren Das OP wollte nur das Arbeitskonzept illustriert, ich nehme an. Die Frage, wie sie derzeit geschrieben wird, fragt nicht nach JSON-Parsing. –

+0

ich es ist unklar, weiß, ich habe nicht downvote, nur für den Fall OP erwähnt oder jemand anderes über gültige JSON Ausgabe schert hier –

-1
{ cat file1.json ; echo ','; cat file2.json; } 
+1

Bitte geben Sie Erklärung, Code nur Antworten sind von geringem Nutzen.Außerdem glaube ich nicht, dass dies das erreicht, was OP gewünscht hat, das druckt eine Datei, ein ',' auf einer neuen Zeile und dann eine andere Datei, alles in einer Untershell. –

1

Es sind, ist nicht ganz klar, was Sie die endgültige Struktur sein wollen, aber lassen Sie mich zu helfen versuchen.

Ich nehme an, Sie haben 2 Dateien mit nur gültigen JSON und raten von Ihrer Frage, dass Sie beide Dateien als Mitglieder eines Arrays drucken möchten.

ich aus Gründen der Beispiele setzen voraus, werden feststellen, dass file1.json wie folgt aussieht:

{"name":"object1"} 

Und file2.json wie folgt aus:

{"name":"object2"} 

Dies kann mit jq, ein äußerst nützliches Werkzeug durchgeführt werden Analysieren von JSON-Streams mithilfe der Option -s/--slurp, die den gesamten Eingabestream in einen Puffer liest, anstatt jedes Objekt einzeln zu verarbeiten. Es hat den zusätzlichen Vorteil, die Objekte zu einem Array zu kombinieren. Wir können den standardmäßigen Passthrough-Filter verwenden und beide Dateien in ein Array pipen.

cat file1.json file2.json | jq --slurp '.' 

Will Ausgang:

[ 
    { 
    "name": "object1" 
    }, 
    { 
    "name": "object2" 
    } 
] 

Demo

Wenn Sie das Array innerhalb eines Objekts möchten, können Sie den Filter verwenden {"array":.}

Demo

I jq empfehlen für jede JSON Interaktion Sie planen, aus einer Shell auf zu tun, aber wenn Sie nicht können, und müssen builtins verwenden, könnten Sie so etwas wie dieses Hack zusammen:

echo '['"$(cat file1.json)"','"$(cat file2.json)"']' 

Diese Lösung, die Befehle in ihnen Subshells $() auszuführen verwendet und umfassen ihre Ausgabe im Echo.

Ich wiederhole noch einmal, verwenden Sie jq. Es ist sauberer, robuster und stellt sicher, dass Eingabe und Ausgabe gültige JSON sind.

+0

Will, upvoted Ihre Antwort für seine Informationen und Nützlichkeit, aber die angenommene Antwort war die einfachste, nachdem ich meine Frage bearbeitet habe, um quadratische Klammern zu verwenden. Vielen Dank. –

Verwandte Themen