【问题标题】:Parsing a python dictionary in bash shell在 bash shell 中解析 python 字典
【发布时间】:2018-07-09 22:58:03
【问题描述】:
$ query_op=$(ssh -p 29418 myreview-server.com gerrit query --files --current-patch-set --format=JSON --commit-message change:99934 | head -n 1 | python -c "import sys, json; print json.load(sys.stdin)['currentPatchSet']['files']")
$ echo $query_op
[{u'deletions': 0, u'insertions': 11, u'type': u'ADDED', u'file': u'/COMMIT_MSG'}, {u'deletions': 0, u'insertions': 2, u'type': u'MODIFIED', u'file': u'foo/bar/baz/info.txt'}]

如何查找file 中的任何一个是否以字符串foo 开头?在上面显示的示例中,我需要做一些操作,因为有一个以foo/ 开头的文件,即foo/bar/baz/info.txt,如果在整个字典值中没有文件以foo/ 开头,那么我需要做不同的操作。

【问题讨论】:

  • 为什么不在你的 Python 小块中进行解析呢? any(x['file'].startswith('foo') for x in ...) 会这样做(其中... 是您当前正在打印的表达式)。
  • 它确实有效,谢谢。
  • @Blckknght,您能否将其添加为解决方案,我会接受。

标签: python json shell


【解决方案1】:

正如我所评论的,您可以修改您的 Python 单行代码来检查 foo 前缀,而不是打印出整个字典。很容易更改它,以便 Python 打印 True 或 False,只需使用生成器表达式和 any 包装当前的 json.loads 调用:

any(x['file'].startswith('foo') for x in json.load(sys.stdin)['currentPatchSet']['files'])

另一个可能更容易处理周围 bash 脚本中的输出的选项是在 Python 中使用 sys.exit 将结果作为 Python 解释器的退出代码发送,而不是作为发送到标准输出的文本。方便的是,Python 的bool 数据类型是int 的子类(True 等于1 和False 等于0),因此您可以将any 调用的结果传递到将上面的代码直接发送到sys.exit 而不是printing 它。传统上,退出代码0 表示成功,而1 表示失败,因此您可能需要sys.exit(not any(...))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多