Изменение json/исправление json внутри скрипта оболочки (удалить конечную запятую)

Для Рел выполните команду top . Затем нажмите shift + f, затем нажмите k, а затем Enter. Это отсортирует вывод по загрузке ЦП.

3
31.03.2019, 23:38
2 ответа

Эта команда jq внесет именно эти изменения:

jq --arg user_path "$user_path" '
   .forgedAlliance += {
        installationPath: ($user_path + "/.steam/steam/steamapps/common/Supreme Commander Forged Alliance"),
        path: ($user_path + "/.steam/steam/steamapps/common/Supreme Commander Forged Alliance"),
        preferencesFile: ($user_path + "/.steam/steam/steamapps/compatdata/9420/pfx/drive_c/users/steamuser/Local Settings/Application Data/Gas Powered Games/Supreme Commander Forged Alliance/Game.prefs"),
        executableDecorator: ($user_path + "/faf/run \"%s\"")
    }'

Здесь используется

  1. --arg user_path "$user_path"чтобы ввести переменную оболочки в программу jq(вы также можете использовать оператор привязки переменных "'"$user_path"'" as $user_path |, но это потребует уродливого объединения кавычек)
  2. Обновить -назначение .forgedAlliance +=для обработки всего файла,обновление только значения ключа «forgedAlliance» путем слияния его с тем, что справа.
  3. Новый объект, созданный из {по}только с новыми значениями ключа, которые вы хотели вычислить внутри него. Если существуют существующие ключи с таким же именем, они будут заменены.
  4. $user_pathдля доступа к этой привязке переменных, которую мы сделали выше.

Пробелы необязательны -они просто нужны для облегчения чтения на этом сайте.

jq всегда выводит как действительный JSON, поэтому вам не нужно выполнять очистку запятых. Вы можете найти командуspongeиз moreutils полезной для обновления самого файла, потому что в jq нет эквивалента -i, но вы также можете просто перенаправить на другой файл

jq... > tmpfile
mv tmpfile prefs.json

и обойти его вручную.

Есть один (небольшой? )разница с тем, что делал ваш код :вы не вносили изменений для pathи installationPath, если «путь» появлялся где-либо в файле. Невозможно воспроизвести это с помощью jq напрямую, но вы можете разделить команду на две части (одну для пути, одну на все время ), если в этом есть необходимый семантический элемент. Эта команда будет всегда вносить изменения, но если она уже получила такое же значение для ключа, это не имеет никакого эффекта.


Если это фиксированный набор замен, вы также можете создать файл, содержащий только объект из пункта 3 выше, буквально (как настоящий JSON, а не динамически вычисляемый ), а затем использовать

jq --slurpfile tmp rhs.json '.forgedAlliance += tmp[0]'

с тем же эффектом, что и большая команда выше.

6
27.01.2020, 21:13

для замены строк поместите свои строки в заполнители A, B ниже,
избегайте любого / в A с помощью \/ и ~в качестве подразделителя sed, а_
Например. A -> "исполняемый декоратор":
(B ваша новая вставленная строка)

sed -E '/A/{N;/A.*\n\s*\}/ {s~(A).*\n~\1B\n~;b} ;s~(A).*\n~\1B,\n~ }' B.json

некоторый экземпляр расширения;

sed -E '/"executableDecorator":/{N;/"executableDecorator":.*\n\s*\}/ {s~("executableDecorator":).*\n~\1B\n~;b} ;s~("executableDecorator":).*\n~\1B,\n~ }' B.json
0
27.01.2020, 21:13

Теги

Похожие вопросы