linux - sed匹配JSON数据中的数字
高洛峰
高洛峰 2017-04-17 11:36:03
[Linux讨论组]
{"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)
求解!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
迷茫

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

高洛峰

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

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

怎么不光是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'])

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

黄舟

你的正则是贪婪的,会匹配 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'])

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号