Linux 如何在shell脚本中读取和解析JSON而不使用JSON工具和JQ工具

Linux 如何在shell脚本中读取和解析JSON而不使用JSON工具和JQ工具,linux,bash,shell,unix,sh,Linux,Bash,Shell,Unix,Sh,我正试图通过RESTAPI从artifactory下载工件(.war文件)。我正在从artifactory获取JSON格式的文件夹名称,我希望通过shell脚本在一个变量中获取该名称,但如果不使用JSON工具和JQ工具,我就无法做到这一点,因为我的服务器不包含这两种工具。谁能帮我拿一下这些吗 我试过下面的命令 $ databasename=`cat process.json | json select '.uri'` $ echo $databasename 及 由于我没有JQ和JSON工具,

我正试图通过RESTAPI从artifactory下载工件(.war文件)。我正在从artifactory获取JSON格式的文件夹名称,我希望通过shell脚本在一个变量中获取该名称,但如果不使用JSON工具和JQ工具,我就无法做到这一点,因为我的服务器不包含这两种工具。谁能帮我拿一下这些吗

我试过下面的命令

$ databasename=`cat process.json | json select '.uri'`
$ echo $databasename

由于我没有JQ和JSON工具,它失败了

$ curl -u User:API Key https://artifactory.es.abc.com/artifactory/api/storage/abc/com/xyz/aa/bb/xx/?list&listFolders=1&includeRootPath=0  > process.json
$ databasename=`cat process.json | json select '.uri'`
$ echo $databasename

您可以使用
grep
sed
获取所需的数据。我本来会添加一个完整的示例,但URL不正确,而且您还没有提供(部分)json

$ cat tmp.json
{
        "json": {
                 "array": [ 1, 2, 3 ]
        },
        "uri": "derp"
}
$ grep 'uri' tmp.json | sed -r 's/^[^:]*:(.*)$/\1/'
 "derp"
对于单行上的数据,可以使用以下命令:

echo '{ "uri" : "/abc", "folder" : true },' | grep -Eo '"uri"[^,]*' | grep -Eo '[^:]*$'

第一个grep将搜索“uri”和后面的所有内容,直到找到逗号,第二个grep将从冒号到字符串末尾提取所有内容

更具可读性和易于理解的解决方案是:

cat process.json | tr { '\n' | tr , '\n' | tr } '\n' | grep "uri" | awk  -F'"' '{print $4}'

我尝试使用您的解决方案,但出现以下错误-第2行:{:未找到命令第3行:uri:未找到命令第2行是-curl-u用户:API Key>tmp.json第3行是-grep'uri'tmp.json{sed-r's/^:[^:::*:(*)$/\1/'我的数据类似于-{“uri”:“/abc”,“folder”:true},echo“{“uri”:“/abc”,“folder”:true}”,“grep-Eo”[^,]*“|grep-Eo”[^:::::*$”为我工作..谢谢:)
awk
可以完成
tr
grep
sed
的所有工作,并且在只读取单个文件时不需要
cat
(它的工作是将多个文件连接到一个流中).
cat foo | bar
只提供了
bar
一个FIFO,而
bar在链接副本中使用
python
查看答案。(还有一些基于
awk
的解决方案,但由于通常的原因,它们的能力较低)…请注意,您的答案中没有一个是按照“parse”一词的正式含义解析JSON的,或者“JSON”的广义含义是“所有符合JSON规范的文档”。有很多情况下,文本解析器对这些情况一无所知——例如,如果某些内容包含
\“
而不是文字引号,则需要将其转换为
在数据中,而不是结束它所属的字符串。字符串可以包含引号(如果引用),或大括号…等等。
cat process.json | tr { '\n' | tr , '\n' | tr } '\n' | grep "uri" | awk  -F'"' '{print $4}'