在Unix上,没有向操作系统添加任何内容(即仅使用 grep , awk , sed , cut 等等),如何仅在“codeView”部分中提取“text”行(并在“probableStartLocationView”部分中忽略它)?
. . .
"events" : [ {
"id" : "12345",
"important" : true,
"type" : "Creation",
"description" : "Something happened here",
"extraDetails" : null,
"codeView" : {
"lines" : [ {
"fragments" : [ {
"type" : "NORMAL_CODE",
"value" : "str = wrapper.getParameter("
}, {
"type" : "CODE_STRING",
"value" : ""abcd""
}, {
"type" : "NORMAL_CODE",
"value" : ")"
} ],
"text" : "str = wrapper.getParameter("abcd")"
} ],
"nested" : false
},
"probableStartLocationView" : {
"lines" : [ {
"fragments" : [ {
"type" : "STACKTRACE_LINE",
"value" : "<init>() @ JSONInputData.java:72"
} ],
"text" : "<init>() @ JSONInputData.java:72"
} ],
"nested" : false
},
. . .
答案 0 :(得分:0)
如果你真的只需要使用OS附带的工具,你可以试试这样的东西:
JSONString='"codeView" : { "lines" : [ { "fragments" : [ { "type" : "NORMAL_CODE", "value" : "str = wrapper.getParameter(" }, { "type" : "CODE_STRING", "value" : ""abcd"" }, { "type" : "NORMAL_CODE", "value" : ")" } ], "text" : "str = wrapper.getParameter("abcd")" } ], "nested" : false },'
function jsonParse() {
awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$1'\042/){print $(i+1)}}}' | tr -d '"' | sed -n 1p
}
printf "$(echo $JSONString | jsonParse text)"
请注意:这根本不是一种安全的方法,因为它不会解析 JSON。它只是提取text
密钥。
演示可用here。
但是,在您的示例中,有两个text
键,此代码只会获得第一个键。如果在第一个之后需要任何text
密钥,则必须稍微改变代码。您需要将sed
定位到您需要的确切行。假设你需要text
块中的第二个"codeView"
,你会写
sed -n 2p
而不是sed -n 1p
。
第二个text
密钥的演示是here。
答案 1 :(得分:0)
jq 处理器的正确方法(假设.events
是输入JSON结构第一级的键):
jq -r '.events[0].codeView.lines[0].text' input.json
输出:
str = wrapper.getParameter("abcd")
答案 2 :(得分:0)
这可能适合你(GNU sed):
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="myid">0129</div>
<div id="myid2"></div>
将当前部分保存在保留空间中,并将其附加到该部分中的每一行。使用类似grep的选项sed -n '/^"[^"]*"/h;//!G;/"text".*\n"codeView"/P;d' file
可以防止正常打印行并使用正则表达式,-n
命令可以打印符合条件的行。