Bash JSON
2014-01-21 14:42
190 查看
#!/usr/bin/env bash throw () { echo "$*" >&2 exit 1 } BRIEF=0 LEAFONLY=0 PRUNE=0 usage() { echo echo "Usage: JSON.sh [-b] [-l] [-p] [-h]" echo echo "-p - Prune empty. Exclude fields with empty values." echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options." echo "-h - This help text." echo } parse_options() { set -- "$@" local ARGN=$# while [ $ARGN -ne 0 ] do case $1 in -h) usage exit 0 ;; -b) BRIEF=1 LEAFONLY=1 PRUNE=1 ;; -l) LEAFONLY=1 ;; -p) PRUNE=1 ;; ?*) echo "ERROR: Unknown option." usage exit 0 ;; esac shift 1 ARGN=$((ARGN-1)) done } awk_egrep () { local pattern_string=$1 gawk '{ while ($0) { start=match($0, pattern); token=substr($0, start, RLENGTH); print token; $0=substr($0, start+RLENGTH); } }' pattern=$pattern_string } tokenize () { local GREP local ESCAPE local CHAR if echo "test string" | egrep -ao --color=never "test" &>/dev/null then GREP='egrep -ao --color=never' else GREP='egrep -ao' fi if echo "test string" | egrep -o "test" &>/dev/null then ESCAPE='(\[^u[:cntrl:]]|\u[0-9a-fA-F]{4})' CHAR='[^[:cntrl:]"\]' else GREP=awk_egrep ESCAPE='(\\[^u[:cntrl:]]|\u[0-9a-fA-F]{4})' CHAR='[^[:cntrl:]"\\]' fi local STRING=""$CHAR*($ESCAPE$CHAR*)*"" local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?' local KEYWORD='null|false|true' local SPACE='[[:space:]]+' $GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$" } parse_array () { local index=0 local ary='' read -r token case "$token" in ']') ;; *) while : do parse_value "$1" "$index" index=$((index+1)) ary="$ary""$value" read -r token case "$token" in ']') break ;; ',') ary="$ary," ;; *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;; esac read -r token done ;; esac [ "$BRIEF" -eq 0 ] && value=`printf '[%s]' "$ary"` || value= : } parse_object () { local key local obj='' read -r token case "$token" in '}') ;; *) while : do case "$token" in '"'*'"') key=$token ;; *) throw "EXPECTED string GOT ${token:-EOF}" ;; esac read -r token case "$token" in ':') ;; *) throw "EXPECTED : GOT ${token:-EOF}" ;; esac read -r token parse_value "$1" "$key" obj="$obj$key:$value" read -r token case "$token" in '}') break ;; ',') obj="$obj," ;; *) throw "EXPECTED , or } GOT ${token:-EOF}" ;; esac read -r token done ;; esac [ "$BRIEF" -eq 0 ] && value=`printf '{%s}' "$obj"` || value= : } parse_value () { local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0 case "$token" in '{') parse_object "$jpath" ;; '[') parse_array "$jpath" ;; # At this point, the only valid single-character tokens are digits. ''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;; *) value=$token isleaf=1 [ "$value" = '""' ] && isempty=1 ;; esac [ "$value" = '' ] && return [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1 [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1 [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1 [ "$print" -eq 1 ] && printf "[%s]t%sn" "$jpath" "$value" : } parse () { read -r token parse_value read -r token case "$token" in '') ;; *) throw "EXPECTED EOF GOT $token" ;; esac } parse_options "$@" if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]); then tokenize | parse fi
本文出自 “Art_Hero” 博客,请务必保留此出处http://curran.blog.51cto.com/2788306/1353428
相关文章推荐
- 美化 JSON 通过 BASH 命令
- shell/bash解析JSON
- [转]登录Linux时/etc/profile、~/.bash_profile等几个文件的执行过程
- PHP学习散记_编码(json_encode 中文不显示)
- Ajax与JSON的一些总结(转)
- 【common】JavaScript ----- 对象转化为json字符串
- javascript将form表单中的元素值封装成json格式
- jquery+json+php新手实践<客户端传值_服务器端计算>
- javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
- JSON分析_服务端返回json和客户端解析json
- golang的json操作[转]
- PHP的serialize序列化数据与JSON格式化数据
- 解析json数组——TypeToken
- json
- 使用Httpclient向百度翻译提交POST请求 接受返回的JSON字符串 实现翻译功能(1)----程序实现原理
- vs2012 编译jsoncpp和使用jsoncpp lib出现的问题
- root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题
- 如何调试bash脚本
- Json查询
- 在 Linux 中纠正 Bash 命令拼写错误