我有一个像这样的json文件:
{"field1": "value","field2": [{"field3":"value", ....}],"field4":"value4"}
我想从所有行中提取,只是field2的值。所以我想要一个类似的输出:
[{"field3":"value", ....}]
[{"field3":"value", ....}]
[{"field3":"value", ....}]
我想知道sed或awk在这种情况下是否有帮助。 我试过用
sed -e 's/^.*"field2":"\([^"]*\)".*$/\1/'
但是我得到了起始文件的相同输出。
我也试过
grep -o '"field2": [^, }]*' people_test_1 | sed 's/^.*: //'
但价值被切断了
答案 0 :(得分:1)
使用jq很容易。
示例:
echo '{"field1": "value","field2": [{"field3":"value","asd":1},{"field3":"value2","asd":2}],"field4":"value4"}' | jq '.field2[] | .["field3"]'
可生产
"value"
"value2
答案 1 :(得分:0)
在您的具体情况下(基于此显式格式,其中内容介于[{
与第一个}]
之间)
sed -e 's/^.*\(\[{.*}\]\).*$/\1/' YourFile
对于任何其他格式(....
的内容包含此模式或其他格式,您必须指定可能的内容。
最终您需要--posix
选项以及此处的强制-e
答案 2 :(得分:0)
我会使用正确的JSON解析器执行此操作。如果您真的想在命令行上使用oneliner,可以发出
echo -e "import json\nfor line in open('file', 'r'): print(json.loads(line)['field2'])" | python
或
python -c "exec(\"import json\nfor line in open('file', 'r'): print(json.loads(line)['field2'])\")"
答案 3 :(得分:0)
您也可以使用此sed命令
$-sed -r 's/[^[]+([^]]*.).*/\1/g' File_name
答案 4 :(得分:0)
假设您的输入文件包含一系列对象,例如
[{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"}]
以下jq
命令将产生所需的输出:
jq '.[]|.field2' people_test_1