0

我有一个 json 文件,其中列出了 3 个项目,如下所示:

{
Item 1
lots of stuff
more stuff 1545
even more
},
{
Item 2
lots of stuff
more stuff 542
},
{
Item 2
lots of stuff
more stuff 675
even more
more words
more text
}

我希望能够 grep 一个字符串,比如 675,如果它发现它返回整个文本“块”,从左括号到右括号。

4

3 回答 3

3

如果通过“grep for a string”你真的是指像通常使用 grep 那样搜索 RE,那么:

awk -v t="675" -v ORS= '{r=r $0 RS} /^}/{if (r~t) print r; r=""}' file

但如果你真的是想像使用 fgrep 那样搜索字符串,那么:

awk -v t="675" -v ORS= '{r=r $0 RS} /^}/{if (index(r,t)) print r; r=""}' file
于 2013-06-19T18:17:05.877 回答
3

用于您的不规则文件格式的 GNU sed 解析器(将您的搜索模式放在位置PATTERN):

sed -nr 'H;/PATTERN/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.*//;x;H}' file
  • 和一些例子:
$sed -nr 'H;/1545/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.*/ /;x;H}' 文件

{
项目 1
很多东西
更多东西 1545
更
},

$sed -nr 'H;/542/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.*/ /;x;H}' 文件

{
第 2 项
很多东西
更多东西 542
},

$sed -nr 'H;/more text/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.* //;x;H}' 文件

{
第 3 项
很多东西
更多东西 675
更
更多的话
更多文字
}
于 2013-06-19T17:37:22.053 回答
2

这是不能做的grep,也不应该做的,bash但如果你GNU awk定义RS},?\n

# find a record containing 1545
$ awk '/1545/' RS='},?\n' ORS='}\n' file
{
Item 1
lots of stuff
more stuff 1545
even more
}

此方法不会使用,like分隔多条记录 should 但如果您需要 valid作为结果JSON,您可以定义ORS},并删除最后一条记录。,JSON

或者,您也可以使用RT而不是显示与正则表达式ORS匹配的分隔符:RS

$ awk '/1545/{printf "%s",$0RT}' RS='},?\n' file
{
Item 1
lots of stuff
more stuff 1545
even more
},

但根据最后一条记录是否与给定模式匹配,您可能仍需要删除尾随,. 一个简单的sed命令就可以解决问题sed '$s/,$//'

不过,我可能只会使用合适的JSON传球手。

于 2013-06-19T16:43:52.790 回答