shell配置文件解析器(json,yaml)
niet的Python项目详细描述
NIET
直接从shell中的yaml文件获取数据
niet就像xmllint或者 jq但是对于yaml和json数据- 您可以使用它来切片、过滤、映射和转换结构化数据。
通过使用简单表达式或使用 xpath访问非平凡数据的高级功能。
您可以轻松地将yaml格式转换为json格式,反之亦然。
功能
- 使用xpath语法提取元素
- 从json格式中提取值
- 从yaml格式中提取值
- 自动检测格式(json/yaml)
- 从文件读取数据或从stdin传递数据
- 格式化输出值
- 将yaml转换为json
- 将json转换为yaml
安装或更新niet
$ pip install -U niet
要求
- python 2.7/python 3+
用法
帮助和选项
$ niet --help usage: niet [-h][-f {ifs,squote,newline,dquote,yaml,json}][-s][-v] object [file] Read data from YAML or JSON file positional arguments: object Path to object separated by dot (.). Use '.' to get whole file. eg: a.b.c file Optional JSON or YAML filename. If not provided niet read from stdin optional arguments: -h, --help show this help message and exit -f {ifs,squote,newline,dquote,yaml,json}, --format {ifs,squote,newline,dquote,yaml,json} output format -s, --silent silent mode, doesn't display message when element was not found -v, --version print the Niet version number and exit(also --version) output formats: ifs Return all elements of a list separated by IFS env var squote Add single quotes to result newline Return all element of a list in a new line dquote Add double quotes to result yaml Return object in YAML json Return object in JSON
使用来自stdin
的json$ echo'{"foo": "bar", "fizz": {"buzz": ["1", "2", "Fizz", "4", "Buzz"]}}'| niet fizz.buzz 12 Fizz 4 Buzz $ echo'{"foo": "bar", "fizz": {"buzz": ["1", "2", "Fizz", "4", "Buzz"]}}'| niet fizz.buzz -f squote '1''2''Fizz''4''Buzz' $ echo'{"foo": "bar", "fizz": {"buzz": ["1", "2", "fizz", "4", "buzz"]}}'| niet . -f yaml fizz: buzz: - '1' - '2' - fizz - '4' - buzz foo: bar $ echo'{"foo": "bar", "fizz": {"buzz": ["zero", "one", "two", "three"]}}'| niet "fizz.buzz[2]" two $ echo'{"foo": "bar", "fizz": {"buzz": ["zero", "one", "two", "three"]}}'| niet -f dquote "fizz.buzz[0:2]""zero""one" $ echo'{"foo": "bar", "fizz": {"buzz": ["zero", "one", "two", "three"]}}'| niet -f dquote "fizz.buzz[:3]""zero""one""two"
使用yaml文件
考虑包含以下内容的yaml文件:
# /path/to/your/file.yamlproject:meta:name:my-projectfoo:barlist:-item1-item2-item3
您可以在本地download the previous example进行测试,也可以使用命令行执行以下操作:
wget https://gist.githubusercontent.com/4383/53e1599663b369f499aa28e27009f2cd/raw/389b82c19499b8cb84a464784e9c79aa25d3a9d3/file.yaml
您可以使用这样的niet从该文件检索数据:
$ niet ".project.meta.name" /path/to/your/file.yaml my-project $ niet ".project.foo" /path/to/your/file.yaml bar $ niet ".project.list" /path/to/your/file.yaml item1 item2 item3 $ # assign return value to shell variable $ NAME=$(niet ".project.meta.name" /path/to/your/file.yaml) $ echo$NAME my-project
使用json文件
考虑包含以下内容的json文件:
{"project":{"meta":{"name":"my-project"}},"foo":"bar","list":["item1","item2","item3"]}
您可以在本地download the previous example进行测试,也可以使用命令行执行以下操作:
wget https://gist.githubusercontent.com/4383/1bab8973474625de738f5f6471894322/raw/0048cd2310df2d98bf4f230ffe20da8fa615cef3/file.json
您可以使用这样的niet从该文件检索数据:
$ niet "project.meta.name" /path/to/your/file.json my-project $ niet "project.foo" /path/to/your/file.json bar $ niet "project.list" /path/to/your/file.json item1 item2 item3 $ # assign return value to shell variable $ NAME=$(niet "project.meta.name" /path/to/your/file.json) $ echo$NAME my-project
输出格式
可以使用-f或--format选项更改输出格式 争论。
默认情况下,niet检测输入格式并显示复杂对象 同样的格式。如果对象是列表或值,则换行输出 将使用格式。
输出格式为:
- 如果
- squote
- dquote
- 换行符
- 山药
- json
如果
ifs输出格式打印列表的所有值或一行中的单个值。 如果定义了ifs环境变量,则所有值都由ifs环境变量的内容分隔, 否则的话。
示例(考虑前面的YAML file example):
$ IFS="|" niet .project.list /path/to/your/file.yaml -f ifs item1|item2|item3 $ IFS=" " niet .project.list /path/to/your/file.yaml -f ifs item1 item2 item3 $ IFS="@" niet .project.list /path/to/your/file.yaml -f ifs item1@item2@item3
这在一个换壳循环中很有用, 当然,您的内容必须不包含ifs值:
OIFS="$IFS"IFS="|"for i in $(niet .project.list /path/to/your/file.yaml -f ifs);doecho${i}doneIFS="${OIFS}"
前面的示例提供以下输出:
item1 item2 item3
对于单引号,请参见带ifs的squote输出或dquote双引号输出
平方根
squotes输出格式打印列表的所有值或一行中的单个值。 所有值都用单引号引起来,并用ifs值分隔。
示例(考虑前面的YAML file example):
$ # With the default IFS $ niet .project.list /path/to/your/file.yaml -f squote 'item1''item2''item3' $ # With a specified IFS $ IFS="|" niet .project.list /path/to/your/file.yaml -f squote 'item1'|'item2'|'item3'
dquotes输出格式打印列表的所有值或一行中的单个值。 所有值都用双引号引起来,并用ifs值分隔。
示例(考虑前面的YAML file example):
$ # With the default IFS $ niet .project.list /path/to/your/file.yaml -f dquote 'item1''item2''item3' $ # With a specified IFS $ IFS="|" niet .project.list /path/to/your/file.yaml -f dquote "item1"|"item2"|"item3"
换行符
换行输出格式打印一个列表值或每行一个值。 此格式在读取循环时使用shell。例如:
whileread value: doecho$valuedone < $(niet --format newline project.list your-file.json)
山药
不管输入文件格式如何,yaml输出格式都强制输出为yaml格式。
json
json输出格式强制输出为json格式,而不考虑输入文件格式。
未找到结果
默认情况下,如果没有找到结果,niet会显示一条特定的消息并返回
错误代码1
,例如:
$ echo'{"foo": "bar", "fizz": {"buzz": ["1", "2", "3"]}}'| niet fizz.gogo Element not found: fizz.gogo $ echo$?1
你可以通过让niet进入静默模式来避免这种行为。
静默模式允许您隐藏特定的消息错误,但继续返回
找不到密钥时,等于1
的状态代码。
您可以通过使用标志-s/--silent
使用静默模式,例如:
$ echo'{"foo": "bar", "fizz": {"buzz": ["1", "2", "3"]}}'| niet fizz.gogo -s $ echo$?1
处理错误
当您的JSON文件内容无效时,NIET显示错误并退出
返回代码为1
您可以这样轻松地保护脚本:
^{公关1八}$示例
您可以使用项目源代码提供的示例来尝试niet。
All the following examples use the sample file available in niet sources code at the following location
tests/samples/sample.yaml
.
示例:
# tests/samples/sample.yamlproject:meta:name:my-projectfoo:barlist:-item1-item2-item3
检索项目名称:
$ niet project.meta.name tests/samples/sample.yaml my-project
处理项目列表
$ for el in $(niet project.list tests/samples/sample.yaml);doecho${el};done item1 item2 item3
将json转换为yaml
使用niet,您可以轻松地将json转换为yaml
$ niet . tests/samples/sample.json -f yaml project: foo: bar list: - item1 - item2 - item3 meta: name: my-project
将yaml转换为json
使用niet,您可以轻松地将yaml转换为json
$ niet . tests/samples/sample.yaml -f json {"project": {"meta": {"name": "my-project"}, "foo": "bar", "list": ["item1", "item2", "item3"]}}
提示
您可以使用以下引号或不使用引号来传递搜索:
$ niet project.meta.name your-file.yaml
$ niet "project.meta.name" your-file.yaml
贡献
如果你想为niet做贡献please first read the contribution guidelines
许可证
这个项目是在麻省理工学院的许可下进行的。
See the license file for more details
贝劳先生herveberaud.pro@gmail.com 塞巴斯蒂安·博伊伦sebastien@boyron.eu