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

cof*_*eak 1 bash shell parsing json jq

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

payment_test_service1_api[host] HOST1
payment_test_service1_api[username] USERNAME1
payment_test_service1_api[password] PASSWORD1
Run Code Online (Sandbox Code Playgroud)

对于这种JSON格式:

"payment_test" {
    "service1" : 
    {
      "api": {
        "host": "HOST1",
        "username": "USERNAME1",
        "password": "PASSWORD1"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

pea*_*eak 7

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

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

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

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

使用命名捕获变量

改进将是使用命名捕获变量.jq提供了一个过滤器,capture用于从捕获变量创建对象; 它可以from_entries像这样使用:

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

使用这样的技术,字符串"payment_test_service1_api"也可以被解析,但OP对此的期望还不清楚,所以也许最好留给另一个问答.