Commande Sed avec \ n

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