bash 修改 json 文件字段

0 前提准备

需要有 jq 命令。如果没有需要先安装(如 ubuntu,使用 apt-get install jq)。

1 细节分解

1.1 修改单个 json 对象中的字段

jq '.attr_field=xxx' test.json

1.2 修改 json 对象数组中的字段(无过滤条件)

jq 'map(.attr_field=xxx)' test.json

1.3 修改 json 对象数组中的字段(有过滤条件)

(只修改 id 为 baz 的 json 对象)

jq 'map(if .id=="baz" then .attr_field=xxx)' test.json

1.4 jq 的结果替换原始 json 文件

jq '.attr_field=xxx' test.json > conf.tmp && mv conf.tmp test.json

1.5 pretty print 输出 json 变量

echo $content | jq . > output.json

2 综合案例

2.1 需求描述

config.json 内容如下:

[
  {
    "tags": "玄幻,都市",
    "start_timestamp": 1590249600,
    "stop_timestamp": 1590336000,
    "output_path": "./output"
  }
]

将 config.json 中的 start_timestamp 和 end_timestamp 的值改为昨天的 0 点到 24 点的时间戳。

2.2 脚本代码

#!/bin/bash

# 将配置文件中的时间戳改为前一天的时间(0:00-24:00)
# (可配合 crontab,每天自动运行)

# 配置文件的路径,根据实际情况修改
config_file='./config.json'

set -ex

function update() {
    start_time=$(date -d $(date --date="-1 day" +%Y-%m-%d) +%s)
    end_time=$(date -d $(date +%Y-%m-%d) +%s)

    content=$(jq "map(.start_timestamp=$start_time)" $config_file)
    content=$(jq "map(.stop_timestamp=$end_time)" <<< "$content")

    echo $content | jq . > rule.tmp && mv rule.tmp $config_file
}

update