Как сделать незаметную печать на довольно JSON файле в оболочке >> последовательная строка JSON >> ES _bulk?

Итак, проведя пару дней, вспоминая, как кодировать все виды инструментов Unix, таких как sed, awk и grep, изучая пару относительно новых, таких как завиток (я знаю, правильно? Я даже вырываю gcc для первый раз, возможно, через 20 лет, но все это быстро возвращается) и добились значительного прогресса в создании небольшой JSON DB для использования с Elasticsearch на AWS EC2.

Но я просто попал в проблему с массовой индексацией, поскольку конечная точка ES _bulk требует, чтобы файлы были в основном последовательными строками JSON с \n терминаторами для каждой строки; и то, что я создал с использованием различных веб-API, и предварительная обработка файлов - это довольно JSON, то есть легко читаемый человеком.

Есть ли простой метод оболочки script, чтобы весь симпатичный JSON просто конкатенировался в строки, не загружая некоторые библиотеки Java или что-то еще? Я могу добавить токены к основному файлу во время предварительной обработки, чтобы пометить нужные \n перерывы, если это поможет разобрать, но если у кого-нибудь есть подсказка на наборе инструментов, я был бы благодарен, поскольку я - это маленький шаг от присоединения к концам проект. У меня есть ощущение, что там есть скрипты, и я знаю, что есть несколько библиотек, но я пока не нашел простых инструментов командной строки, чтобы сделать незаметную печать.

Большое спасибо за любые советы,

Приветствия

Сид

Ответ 1

Вы можете попробовать отличный инструмент jq для разбора JSON в оболочке. Чтобы удалить текст с помощью jq, вы можете использовать любой из следующих способов:

cat pretty-printed.json | jq -c .
jq -c . pretty-printed.json

-c (или --compact-output) указывает на не очень печатную (по умолчанию). "." говорит ему вернуть содержимое JSON "как есть" без изменений, кроме переформатирования. Он сбрасывается обратно в stdout, поэтому вы можете перенаправить вывод или передать его на что-то еще.

P.S. Я искал решение той же проблемы и пришел к этому варианту.

Ответ 2

Вы можете попробовать найти/заменить с помощью regexp:

  • Найти, что: "^\s {2,}" заменить на ""
  • Найти, что "\n" заменить ""

Смотрите это: https://github.com/dzhibas/SublimePrettyJson/issues/17

Ответ 3

Ответ от D_S_toowhite не был прямым ответом, но он заставлял меня думать правильно, то есть проблема заключалась в том, чтобы удалить все пустое пространство. Я нашел очень простой способ удалить все пробелы с помощью инструмента командной строки tr:

tr -d [:space:] inputfile

Тег: space: теги удаляет все пробелы, табуляции, пробелы, вертикальные вкладки и т.д. Таким образом, хороший вход JSON выглядит следующим образом: -

{
    "version" : "4.0",
    "success" : true,
    "result" :
    {
            "Focus" : 0.000590008,
            "Arc" : 12
    }
}

становится этой последовательной строкой JSON:

{"version":"4.0","success":true,"result":{"Focus":0.000590008,"Arc":12}}

Мне еще нужно решить \n терминатор, но я думаю, что это тривиально, по крайней мере, в моем специальном случае, просто добавьте после закрытия пары кронштейнов, используя sed.

Большое спасибо за предложение.

Приветствия

Сид

Ответ 4

jsonlint легко запускается и запускается в командной строке с помощью npm, и простой способ распечатать ' нет пуха 'JSON, чтобы дать ему отличительный характер ".

jsonlint -t ""

В качестве бонуса для пользователей командной строки я все время использую это для приема буферов-папок (на Mac) и преобразования их в нечто другое, например:

Содержимое своп-буфера для сжатого формата JSON:

pbpaste | jsonlint -t "" | pbcopy

Содержимое своп-буфера для довольно напечатанного формата JSON:

pbpaste | jsonlint | pbcopy

Вы также можете передать содержимое файла в уродливую (и JSON-литую) версию файла:

cat data-pretty.json | jsonlint -t "" > data-ugly.json