如何在Bash中将字符串列表转换为JSON字符串数组?

wil*_*mdh 3 arrays string bash json jq

如何在Bash中使用包含换行符的字符串列表转换变量,如下所示

groups="group_1
group_2
group_3"
Run Code Online (Sandbox Code Playgroud)

到JSON字符串数组:

{
    [ "group_1", "group_2", "group 3" ]
}
Run Code Online (Sandbox Code Playgroud)

这有可能与jq?

pea*_*eak 5

如果你的jq有inputs最简单的可能是使用它:

jq -ncR '[inputs]' <<< "$groups"
["group1","group2","group3"]
Run Code Online (Sandbox Code Playgroud)

否则,这里有三个选择:

jq -c -n --arg groups "$groups" '$groups | split("\n")' 

echo -n "$groups" | jq -cRs 'split("\n")'

echo "$groups" | jq -R -s -c 'split("\n") | map(select(length>0))'
Run Code Online (Sandbox Code Playgroud)

在任何情况下,阵列都可以很容易地合并到JSON对象中,例如通过扩展过滤器 | {groups: .}

如果您确实想要生成无效的JSON,请考虑:

printf "%s" "$groups" | jq -Rrsc 'split("\n") | "{ \(.) }"'
Run Code Online (Sandbox Code Playgroud)

输出:

{ ["group_1","group_2","group_3"] }
Run Code Online (Sandbox Code Playgroud)

选择注意事项(长度> 0)

考虑:

 jq -Rsc 'split("\n")' <<< $'a\nb'
 ["a","b",""]
Run Code Online (Sandbox Code Playgroud)

包含的原因select(length>0)是避免尾随"".

如果$ groups包含连续的换行符,并且如果保留空字符串很重要,那么您可能希望使用[:-1],例如

jq -cRs 'split("\n")[:-1]' <<< "$groups"
["group1","group2","group3"]
Run Code Online (Sandbox Code Playgroud)

如果您的jq不支持[:-1],请将0显式:[0:-1]