{"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个意外:
-
isdir
后边有空白或换行符,之后才是0或1 -
isdir
根本不是整数 - 父元素变化引发
isdir
的层次位置改变,从而逻辑意义不一样了
请老实使用JSON解释器解释JSON。
一个最简单的例子
不考虑任何例外(Exception)和逻辑错误的代码只需要3行:
#! /usr/bin/env python3
import sys, json
print(json.loads(sys.stdin.read())['list'][0]['isdir'])
存储为脚本,加可执行权限,把这个当作过滤器挂在中间就行了。