如何通过多字符分隔符拆分文件?

时间:2017-12-05 22:59:43

标签: regex bash unix awk sed

在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
},
. . .

3 个答案:

答案 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(&quot;abcd&quot;)

答案 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命令可以打印符合条件的行。