如何使用 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/