Удалить запятую json с помощью инструментов командной строки - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу удалить запятую из json as,

{
  "key1": "value1",
  "object": {
    "key2": "value2", // <- remove comma
  },
  "key3": "value3", // <- remove comma
}

Я придумал,

tr -d '\n' | \
sed -E 's:,(\s*}):\1:g' | \
jq .

и это работает, но я хочу получить это полностью в sed.

Я придумал,

sed -E '/,\s*$/ { N; s:,\s*(\n\s*},?):\1: }'

, который работает для указанного выше ввода, но не работает для

{
  "key1": "value1",
  "object": {
    "key2": "value2",
  },
  "key3": "value3",
  "key4": "value4", // <- remove comma
}

когда N читает следующую строку и начинается снова со строки после следующей.

// output sed -E '/,\s*$/ { N;l }' using l/look command
{
  "key1": "value1",\n  "object": {$
  "key1": "value1",
  "object": {
    "key2": "value2",\n  },$
    "key2": "value2",
  },
  "key3": "value3",\n  "key4": "value4",$
  "key3": "value3",
  "key4": "value4",
}

Обновление:

Добавление еще одного примера для тестирования:

{
  "key1": "value1",
  "object1": {
    "object2": {
      "key2": "value2"
    },
  },
  "key3": "value3",
}

Обновление:

Это работает для всего, что я бросил в это.

sed -E -n 'H; x; s:,(\s*\n\s*}):\1:; P; ${x; p}' | \
    sed '1 d'

Пояснение:

sed -E -n 'H; x; P; ${x; p}'

-n 'H; x' для добавления каждой строки к следующей строке в шаблонном пространстве (за исключением последней строки, которая просто печатается с ${x; p})

и

s:,(\s*\n\s*}):\1:;

чтобы удалить запятую в образце.

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

Поскольку входные данные кажутся неким расширением JSON, вы можете использовать инструмент командной строки, предназначенный для таких расширений. Например:

$ hjson -j < input.txt

или

$ any-json --input-format=hjson input.txt

Вывод в обоих случаях

{
  "key1": "value1",
  "object": {
    "key2": "value2"
  },
  "key3": "value3"
}
0 голосов
/ 08 ноября 2018

Вот один в GNU awk.Он использует " в качестве разделителя полей и удаляет запятые перед [ \n]*} из нечетных полей (внешние кавычки, вероятно, потерпят неудачу для "escaped \" inside").Добавлено "key4": "value4,}", к файлу:

$ cat file
{
  "key1": "value1",
  "object": {
    "key2": "value2",
  },
  "key3": "value3",
  "key4": "value4,}",
}

Сценарий обрабатывает весь файл как одну запись (RS="^$"), поэтому он может не работать для больших файлов как есть:

$ awk '
BEGIN {
    FS=OFS="\""
    RS="^$"
}
{
    for(i=1;i<=NF;i++) {                         # or i+=2 and remove the if
        if(i%2)
            $i=gensub(/,([ \n]*\})/,"\\1","g",$i)
    }
}1' file

Вывод:

{
  "key1": "value1",
  "object": {
    "key2": "value2"
  },
  "key3": "value3",
  "key4": "value4,}"
}
0 голосов
/ 08 ноября 2018

Не ответ с sed, а (python) решение:

# load as python dictionary
d = {
  "key1": "value1",
  "object": {
    "key2": "value2",
  },
  "key3": "value3",
}

import json

json.dumps(d) # valid json string
0 голосов
/ 08 ноября 2018

Использование буфера удержания:

sed '/^ *\}/{H;x;s/\([^}]\),\n/\1\n/;b};x;/^ *}/d' input

Это всего лишь упражнение sed, я не думаю, что sed - подходящий инструмент для этой работы. В конце также требуется новая строка или файл заканчивается на }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...