json - 如何使用 jq 将此字符串转换为 JSON?

标签 json bash shell parsing jq

如何使用 jq 将以下行转换为 JSON 格式?

payment_test_service1_api[host] HOST1
payment_test_service1_api[username] USERNAME1
payment_test_service1_api[password] PASSWORD1

对于这种 JSON 格式:

"payment_test" {
    "service1" : 
    {
      "api": {
        "host": "HOST1",
        "username": "USERNAME1",
        "password": "PASSWORD1"
      }
    }
}

最佳答案

以下比@chepner 的解决方案更通用(它使用 add 因此不限于三个键值对)并且可能稍微简单一些:

$ jq -Rn 'inputs | match("\\[(.*)\\] (.*)")
    | .captures | {(.[0].string): (.[1].string)} ' tmp.txt |
  jq -s '{payment_test: { service1: { api: add }}} '

现在很容易看出如何消除对 jq 的第二次调用:

jq -Rn '[ inputs | match("\\[(.*)\\] (.*)")
          | .captures | {(.[0].string): (.[1].string)}]
        | {payment_test: { service1: { api: add }}} ' tmp.txt

使用命名捕获变量

一种改进是使用命名的捕获变量。 jq 提供了一个过滤器,capture,用于从捕获变量中创建一个对象;它可以与 from_entries 结合使用,如下所示:

[inputs | capture("\\[(?<key>.*)\\] (?<value>.*)")]
| from_entries
| {payment_test: { service1: { api: . }}} 

使用此类技术,字符串“payment_test_service1_api”也可以被解析,但 OP 对此的期望尚不清楚,所以最好留给另一个问答。

关于json - 如何使用 jq 将此字符串转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722754/

相关文章:

python - 如何删除 JSON 对象的属性

javascript - Javascript 中的简单 BPM 或工作流程

linux - 找到所有具有特定扩展名的文件然后执行

java - Json 到 Java 对象 - 由于字段相同而失败

javascript - 在单独的组件中获取 json

ruby - 在 bash 中打开一个命名管道,而不读取或写入它

linux - VIM:如何在 Ubuntu 上精确到行

bash - xargs 输出缓冲 -P parallel

linux - Shellscript If 语句返回错误

linux - 在 Linux 中部分合并 2 个文本文件