在jq输出前添加文本



我有以下脚本(来自这个答案)

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"
}`);

最新更新