我有以下脚本(来自这个答案)
data() {
cat <<EOF
Security:ClientId=123456
Security:ClientSecret=abcdefg
AppSettings:Environment=Dev
AnotherCustomSetting=SomethingElse
EOF
}
data | jq -nR '
def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");
reduce inputs as $line ({};
($line | parse) as $p
| if $p.y then .[$p.x][$p.y] = $p.value
else .[$p.x] = $p.value end )
'
效果非常好,输出如下json:
{
"Security": {
"ClientId": "123456",
"ClientSecret": "abcdefg"
},
"AppSettings": {
"Environment": "Dev"
},
"AnotherCustomSetting": "SomethingElse"
}
我正在努力添加和延迟一些文本到这个输出。我需要加上
appConfig = JSON.parse(`
和postpend
`);
所以最终输出看起来像:
appConfig = JSON.parse(`{
"Security": {
"ClientId": "123456",
"ClientSecret": "abcdefg"
},
"AppSettings": {
"Environment": "Dev"
},
"AnotherCustomSetting": "SomethingElse"
}`);
我尝试通过在脚本中添加以下内容来做到这一点:
| xargs printf 'appConfig = JSON.parse(`%s`);`
,但是它要么什么都不打印,要么(稍微摆弄一下)在json的每行上打印我的prepend和deferend文本(而不是仅仅添加到整个json的前部和尾部)。
如何在此输出中添加和延迟文本?
试一下:
printf 'appConfig = JSON.parse(`%s`);' "$(
data | jq -nR '
def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");
reduce inputs as $line ({};
($line | parse) as $p
| if $p.y then .[$p.x][$p.y] = $p.value
else .[$p.x] = $p.value end )
')"
存储在var
中printf -v var 'appConfig = JSON.parse(`%s`);' "$(
data | jq -nR '
def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");
reduce inputs as $line ({};
($line | parse) as $p
| if $p.y then .[$p.x][$p.y] = $p.value
else .[$p.x] = $p.value end )
')"
$ echo "$var"
appConfig = JSON.parse(`{
"Security": {
"ClientId": "123456",
"ClientSecret": "abcdefg"
},
"AppSettings": {
"Environment": "Dev"
},
"AnotherCustomSetting": "SomethingElse"
}`);
您可以将sed
附加到您的管道:
sed '1s@^@JSON.parse(`@; $s@$@`);@'
由两个替换组成:
1s@^@...@
:前置到第一行$s@$@...@
:追加到最后一行
一种全jq的可能性如下:
jq -nRrj '
def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");
reduce inputs as $line ({};
($line | parse) as $p
| if $p.y then .[$p.x][$p.y] = $p.value
else .[$p.x] = $p.value end )
| "appConfig = JSON.parse(`", ., "`);"
'
对于样例输入,这会产生:
appConfig = JSON.parse(`{
"Security": {
"ClientId": "123456",
"ClientSecret": "abcdefg"
},
"AppSettings": {
"Environment": "Dev"
},
"AnotherCustomSetting": "SomethingElse"
}`);