J’ai une firebase database de fichiers JSON partiellement corrompus. La personne qui les a écrits pour une raison quelconque a inclus une virgule supplémentaire à la fin du fichier. Il y a des zillions de ces fichiers, je dois donc les corriger. Voici à quoi ça ressemble:
{ "foo": "bar", "foo1": "bar1", "foo2": "bar2", }
J’essaie donc d’utiliser la commande sed pour me débarrasser des virgules. En ce moment, j’ai sed | ‘, \ n}’ | ‘\ n}’ | ‘ mais cela ne modifie pas le fichier. Qu’est-ce que je fais mal?
La version de sed
avec OS X ne traite pas \n
comme un caractère de nouvelle ligne, mais comme un échappé ‘n’ (qui se réduit à un ‘n’ normal). Puisque vous utilisez bash
, vous pouvez essayer ce qui suit:
sed $'s|,}|\\\n|' file.txt
Le $'...'
est un type particulier de citation dans bash
qui permet de traiter spécialement certaines échappements. \\\n
est une barre oblique inversée suivie d’une nouvelle ligne, que bash
présente à sed
tant que caractère de nouvelle ligne d’échappement unique.
UPDATE: Après avoir mémorisé d’utiliser $
au lieu d’un caractère de nouvelle ligne dans le texte de recherche, j’ai réalisé que vous ne pouvez pas faire correspondre une commande suivie d’une accolade sur la ligne suivante (ou du moins, je ne sais pas comment avec ma commande limitée) de sed
).
Vous pouvez essayer awk:
awk '{ if (/}/) sub(",$", "", last); if (last) print last; last=$0 } END { print last }'
Ceci est une solution sed qui fonctionne également sur OSX:
sed -e ':a' -e 'N; $!ba' -e 's/,\(\n}\)/\1/' file.json
Comme alternative, vous pouvez installer gratuitement sur OSX en utilisant:
sudo brew install gnu-sed
puis lancez:
gsed -e ':a; N; $!ba; s/,\(\n}\)/\1/' file.json