shell配置文件解析器(json,yaml)

niet的Python项目详细描述


NIET

Build StatusPyPIPyPI - Python VersionPyPI - Status

直接从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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
手机上的html调试Java web应用程序   Java当前日期和过去日期之间的差值,以年、月、日、小时、分、秒为单位   如果方法名称相同,java如何使扩展类不从上面的类触发方法?   即使在提供了准确的firebase引用之后,java仍出现“无法跳转到类型”异常。请看详情   jar文件中的java图像   java如何避免从缓存读取时修改相同的对象实例?   Android中java完全控制的线程队列   JTextArea中的java计算   java如何独立运行。jar作为64位mashine上的32位   java在尝试实例化自引用泛型类的实例时,如何处理自引用类型参数   java如何安装着色jar而不是原来的jar   java在resultSet之后使用If-Else   多线程是java。朗,反思一下。方法调用线程安全   java 7语言向后兼容性   Objective C中的Category和Java 8中的Default方法是否等效?