所以,我有一个看起来像这样的JSON文件;
{
"data": { stuff that i need }
"stuff not needed": {more stuff not needed}
"data": {more stuff that i need}
}
简而言之,我需要的东西在“数据”键的花括号内。如何在Linux Shell命令中打印此内容?请注意,我的文件中有几个“数据”对象,我想一次从所有这些对象中提取数据。
预期的输出 会是这样
data {...}
data {...}
答案 0 :(得分:1)
正如其他人建议的那样,您应该真正使用jq
工具来解析json格式。但是,如果您无权使用该工具和/或无法安装它,则下面是一种非常简单的方法,将json视为原始文本(不推荐)并生成所需的输出:
grep "\"data\":" json_file | tr -d \"
答案 1 :(得分:1)
您可以非常简单地将awk
与"{"
的字段分隔符以及substr
和length($2) - 1
一起使用来修剪结尾"}"
。
例如您的数据:
$ awk -F"{" '/^[ ]*"data"/{print substr($2, 1, length($2)-1)}' json
stuff that i need
more stuff that i need
(注意:如果需要,您可以在第一行的"stuff"
之前剪掉开头的空格)
快速说明
awk -F"{"
用awk
的字段分隔符调用'{'
,/^[ ]*"data"/
仅定位以零个或多个空格开头,后跟"data"
的行,print substr($2, 1, length($2)-1)
将第二个字段的子字符串从第一个字符打印到length-1
字符,以除去结尾的'}'
。bash解决方案
使用bash,您可以遍历每行,寻找以"data"
开头的行,然后使用几个简单的参数扩展从每一端删除行中不需要的部分。例如:
$ while read -r line; do
[[ $line =~ ^\ *\"data\" ]] && {
line="${line#*\{}"
line="${line%\}*}"
echo $line
}
done <json
(使用json
文件名中的数据,您只需将其复制/粘贴到终端中即可)
使用/输出示例
$ while read -r line; do
> [[ $line =~ ^\ *\"data\" ]] && {
> line="${line#*\{}"
> line="${line%\}*}"
> echo $line
> }
> done <json
stuff that i need
more stuff that i need
(注意: bash默认分词甚至可以为您处理前导空白)
虽然您可以使用awk
和bash
进行操作,但是任何严重的JSON操作都应使用jq
实用程序来完成。
答案 2 :(得分:1)
使用给定的输入,您可以使用
sed -rn 's/.*"(data)": (.*)/\1 \2/p' inputfile