Как удалить объект в файле JSON с помощью команды Linux

#json #linux

#json #linux

Вопрос:

У меня есть файл JSON, который размещен на сервере Linux. Я хочу удалить объект partcualr со второй позиции и далее. Проблемы:-

  1. Корневой элемент сохраняет его, и тот же объект, который повторяется в файле JSON, должен быть удален.
  2. как добавить квадратные скобки в данные JSON

Я устал sed и awk командовать, но безуспешно

sed '/"audit"/,/}/ d; /^$/d' sample_request.json >> test.json — Это было удаление всего объекта вместо определенного слова.

аудит — Удалите этот объект в файле json со второй позиции в wards. [] — Это поле, которое необходимо добавить к файлу, который отображается как исключенный вывод

Актуально :-

 {
  "audit" : {
    "audit number" : "123",
    "amount" : {
      "Amount" : -10.0,
      "code" : "abc"
    },
    "over" : 1
  },
  "audit" : {
    "audit number" : "234",
    "amount" : {
      "Amount" : 290.0,
      "code" : "xyz"
    },
    "over" : 5
  },
  "audit" : {
    "audit number" : "235",
    "amount" : {
      "Amount" : 270.0,
      "code" : "kdb"
    },
    "over" : 6
  },
  "id" : "test",
  "eid" : "1",
  "bcode" : "123",
  "wid" : "1234",
  "wsid" : "11",
  "ss" : 2
  }
  

Исключенный вывод, как показано ниже:

 {
  "audit" :[{
    "audit number" : "123",
    "amount" : {
      "Amount" : -10.0,
      "code" : "abc"
    },
    "over" : 1
  },
   {
    "audit number" : "234",
    "amount" : {
      "Amount" : 290.0,
      "code" : "xyz"
    },
    "over" : 5
  },
    {
    "audit number" : "235",
    "amount" : {
      "Amount" : 270.0,
      "code" : "kdb"
    },
    "over" : 6
  },
]
  "id" : "test",
  "eid" : "1",
  "bcode" : "123",
  "wid" : "1234",
  "wsid" : "11",
  "ss" : 2
  }
  

Комментарии:

1. Привет, забыл о формате json, Возможно ли удалить тег аудита с помощью sed или awk commond в Linux, если да, пожалуйста, поделитесь полной командой, чтобы попробовать с моей стороны.

2. Взгляните на jq . Попытка обработать JSON с помощью sed или awk — это просто плохой подход с самого начала.

3. @oguzismail если единственной ошибкой является повторяющееся свойство, то это действительно касается afa jq --stream .

4. @oguzismail Я только сейчас понял это — входные данные на самом деле являются допустимым JSON. Сначала я подумал, что для корневого объекта не было закрытия } , но он был просто смещен. Помните, что ключи в объекте JSON не обязательно должны быть уникальными, они просто ДОЛЖНЫ (раздел 2.2).

5. Тем не менее, любой, кто использует неуникальные ключи в объектах JSON, должен, по крайней мере, переосмыслить то, что они делают.

Ответ №1:

В sed вы можете сделать что-то вроде:

 sed -e '1,/audit number/s#audit".*#audit" : [{#' 
    -e '/audit number/,$s#"audit"s*:##' 
    -e '{N;s#,s*"id"#]amp;#;P;D}' input.txt
  

что примерно переводится как:

  1. между строками 1 и первым «номером аудита» замените A на поля аудита.
  2. между первым «номером аудита» и концом замените B на поля аудита.
  3. используйте объединение строк, чтобы найти [пробелы] «id» и вставить ‘]’ перед ним.

Работа с JSON с помощью инструментов string очень опасна, поскольку изменения в интервалах и порядке, которые не имеют значения между программами, обменивающимися JSON, испортят этот стиль синтаксического анализа. Обычно лучше выполнить минимальное количество исправлений, чтобы получить действительный JSON, а затем использовать обычные средства JSON на любимом языке программирования.