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)
以下比@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对此的期望还不清楚,所以也许最好留给另一个问答.