我有一个 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,如果它发现它返回整个文本“块”,从左括号到右括号。
如果通过“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
用于您的不规则文件格式的 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 更 更多的话 更多文字 }
这是不能做的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
传球手。