我有一个 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传球手。