2017-01-12 22 views
1

Verzeihen Sie, wenn das eine triviale Frage ist, habe ich nicht viel Erfahrung damit.Klammern am Anfang und Ende der Datei (JSON) hinzufügen

Ich habe eine Datei, die wie folgt aussieht:

{text}, 
{text}, 
{text}, 
{text}, 

ich es wie dieser

[{text}, 
{text}, 
{text}, 
{text}] 

Hinweis sehen mag, dass das letzte Komma entfernt wird, und dass es jetzt eckige Klammern an der Anfang und das Ende der Datei.

Also, ich habe Tausende von Dateien in einem Verzeichnis, und jede Datei muss dafür repariert werden.

Ich vermute, ich habe irgendwie sed verwenden, aber ich weiß wirklich nicht, wie es geschehen zu lassen und will sie nicht manuell, da es mit VIM tun gibt so viele Dateien ...

EDIT:

ich zu verwenden versucht:

sed -i '1s/^/\[/;$s/,$/\]/' * 

wie codeforester vorgeschlagen. Ich erhalte eine Fehlermeldung, dass „Argument Liste zu lang“ ...

Antwort

2

ich das vorhandene Komma am Ende der Leitungen mit sed würde entfernen, und dann jq verwenden, um den JSON-Array zu erstellen:

sed 's/,$//' file | jq -s . 

zu laufen diese über viele Dateien, empfehle ich einen kleinen Shell-Skript zu erstellen:

fix-json.sh

#!/bin/bash 
file="${1}" 
sed 's/,$//' "${file}" | jq -s . > "${file}.tmp" 
if [ ${PIPESTATUS[1]} != 0 ] ; then 
    echo "${file} is broken" 
    rm "${file}.tmp" 
else 
    mv "${file}.tmp" "${file}" 
fi 

Jetzt find verwenden Sie das Skript auf den Eingabedateien auszuführen:

chmod +x fix-json.sh 
find /path/to/files -type f -name '*.json' -exec ./fix-json.sh {} \; 
+0

ich das Skript kopiert Sie schrieb und es lief wie geschrieben. (außer dem -name '* .json' habe ich gerade -name '*'). So oder so, als ich das tat, passierte nichts mit den Dateien ... d. H. Die Klammern waren nicht da und das letzte Komma wurde nicht entfernt. Außerdem muss ich nur das Komma in der letzten Zeile entfernen, nicht alle Zeilen. – shishy

+0

Sicher, wenn Sie '-name ''' verwenden, wird keine Datei passen. Wenn Sie sich nicht um den Dateinamen kümmern, lassen Sie die Option '-name' komplett weg. Aber seien Sie vorsichtig und erstellen Sie eine Sicherungskopie, bevor Sie dies ausführen (Nur um sicher zu sein, dass Sie nicht etwas Wichtiges in der Frage erwähnt haben). Beachten Sie, dass 'find' rekursiv ausgeführt wird, dh es werden auch Dateien in Unterordnern behandelt. Wenn du das nicht willst, benutze '-maxdepth 1' – hek2mgl

+0

Ich habe alle Dateien im selben Verzeichnis (alle Unterordner zusammengelegt) – shishy

Verwandte Themen