首页 > sed匹配JSON数据中的数字

sed匹配JSON数据中的数字

{"list":[{"fs_id":4176732013,"path":"\/apps\/zjhui\/bash","ctime":1389845838,"mtime":1389845838,"block_list":"[\"286dc423e71186936c39e3507d2d0cf1\"]","size":2076,"isdir":0,"ifhassubdir":0,"filenum":0}],"request_id":2785468470}

有这么一串,我想利用sed将"isdir":0这里的0单独取出来。利用如下命令:
sed -n 's/"isdir":\(.*\)/\1/p'
发现匹配出来的是:

{"list":[{"fs_id":4176732013,"path":"\/apps\/zjhui\/bash","ctime":1389845838,"mtime":1389845838,"block_list":"[\"286dc423e71186936c39e3507d2d0cf1\"]","size":2076,0,"ifhassubdir":0,"filenum":0}],"request_id":2785468470}

isdir没了。而我想要的是isdir后面那个0(这个数字也有可能是1)
求解!


这样也行,sed -n 's/.*"isdir":\([01]\).*/\1/p'。把前后无关的一堆东西都删掉。如果不是0或者1,是个整数,就写成sed -n 's/.*"isdir":\([0-9]*\).*/\1/p'


你的正则是贪婪的,会匹配 isdir 后面的所有字符。可以用下面的命令:

cat test.txt | grep -o '"isdir":[0-9]*' | sed 's/"isdir"://'

参考上面的同学,沙渺

#! /usr/bin/env python3
import sys, json
for line in sys.stdin.read():
    print(json.loads(line)['list'][0]['isdir'])

只修改了一点点.分行读一下,,,,


(╯°口°)╯(┴—┴!
(╯°口°)╯(┴—┴!!
(╯°口°)╯(┴—┴!!!
(╯°口°)╯(┴—┴!!!!
(╯°口°)╯(┴—┴!!!!!

怎么都这么喜欢用正则代替解释器啊!!!

怎么不光是XML/HTML,现在连JSON也这样啊!!!

永远不要用正则表达式代替JSON解释器

JSON虽然没有XML的若干大坑,但仍然是一种格式松散,并且依赖层次表示内容的语言。

这么玩躲不开3个意外:

  1. isdir后边有空白或换行符,之后才是0或1
  2. isdir根本不是整数
  3. 父元素变化引发isdir的层次位置改变,从而逻辑意义不一样了

请老实使用JSON解释器解释JSON。

一个最简单的例子

不考虑任何例外(Exception)和逻辑错误的代码只需要3行:

#! /usr/bin/env python3
import sys, json
print(json.loads(sys.stdin.read())['list'][0]['isdir'])

存储为脚本,加可执行权限,把这个当作过滤器挂在中间就行了。

【热门文章】
【热门文章】