20 个版本 (5 个破坏性更新)
0.6.2 | 2023 年 6 月 1 日 |
---|---|
0.6.1 | 2023 年 5 月 28 日 |
0.5.0 | 2023 年 5 月 27 日 |
0.4.2 | 2023 年 5 月 27 日 |
0.1.2 | 2023 年 3 月 29 日 |
在 命令行实用工具 中排名 1057
每月下载量 309
用于 xplr
53KB
1.5K SLoC
jf
jf 是一个 jo 的替代品,一个用于在命令行中安全地格式化和打印 JSON 对象的小工具。
然而,与 jo
不同,在 jo
中,您通过嵌套 jo
输出来构建 JSON 对象,而 jf
的工作方式类似于 printf
,即它期望将模板作为 YAML 格式作为第一个参数,然后是占位符的值作为后续参数。
例如
jf "{one: %s, two: %q, three: [%(four)s, %(five=5)q]}" 1 2 four=4
# {"one":1,"two":"2","three":[4,"5"]}
安装
Cargo
作为 CLI 工具
cargo install jf
或作为库
cargo add jf
Nixpkgs
nix-env -f https://github.com/NixOS/nixpkgs/tarball/nixos-unstable -iA jf
二进制文件
用法
jf [OPTION]... [--] TEMPLATE [VALUE]... [NAME=VALUE]... [NAME@FILE]...
选项
选项 | 帮助 |
---|---|
- | 即 -f ,从 stdin 读取模板 |
-- | 停止解析 CLI 选项 |
-r, --raw | 打印未经格式化的渲染值 |
-p, --pretty | 以美观的格式打印 JSON 格式化输出 |
-y, --yaml | 将输出打印为 YAML 而不是 JSON |
-h, --help | 打印此帮助消息 |
-v, --version | 打印版本号 |
-f, --file | 将模板参数视为要读取的文件 |
模板
模板应渲染为有效的 YAML。它可以包含以下占位符
%%
字面%
字符%s
%q
读取位置参数%-s
%-q
从 stdin 读取%(NAME)s
%(NAME)q
从参数读取命名值%(NAME=DEFAULT)s
%(NAME=DEFAULT)q
带默认值的占位符%(NAME@FILE)s
%(NAME@FILE)q
从文件路径读取默认值%(NAME@-)s
%(NAME@-)q
从标准输入读取默认值%(NAME?)s
%(NAME?)q
可以为空的占位符,默认为null%(NAME)?s
%(NAME)?q
可选的占位符,默认为空格%*s
%*q
将位置参数扩展为数组项%*-s
%*-q
将标准输入扩展为数组项%**s
%**q
将位置参数扩展为键值对%**-s
%**-q
将标准输入扩展为键值对%(NAME)*s
%(NAME)*q
将命名参数扩展为数组项%(NAME)**s
%(NAME)**q
将命名参数扩展为键值对
使用后缀为q
的占位符进行安全引号的JSON字符串,以及后缀为s
的除字符串之外的JSON值。
规则
- 按照模板中的顺序传递位置占位符的值。
- 使用
NAME=VALUE
语法为命名占位符传递值。 - 使用
NAME=ITEM_N
语法为命名数组项传递值。 - 使用
NAME=KEY_N NAME=VALUE_N
语法为命名键值对传递值。 - 按照顺序将值传递到 stdin,并用空字节(
0
)分隔。 - 使用
NAME@FILE
语法从文件中读取,其中 FILE 可以是-
表示 stdin。 - 不要在命名值之后传递位置值。
- 为了允许通过展开合并数组和对象,如果展开占位符没有传递值,那么在
s
和q
后的尾随逗号(如果有的话)将被自动移除。
示例
jf %s 1
# 1
jf %q 1
# "1"
jf '{%**q}' one 1 two 2 three 3
# {"one":"1","two":"2","three":"3"}
seq 1 3 | xargs printf '%s\0' | jf '[%*-s]'
# [1,2,3]
jf "{%q: %(value=default)q, %(bar)**q}" foo value=bar bar=biz bar=baz
# {"foo":"bar","biz":"baz"}
jf "{str or bool: %(str)?q %(bool)?s, nullable: %(nullable?)q}" str=true
# {"str or bool":"true","nullable":null}
jf '{1: %s, two: %q, 3: %(3)s, four: %(four=4)q, "%%": %(pct?)q}' 1 2 3=3
# {"1":1,"two":"2","3":3,"four":"4","%":null}
Shell 别名
您可以在您的 shell 中设置以下别名
alias str='jf %q'
alias arr='jf "[%*s]"'
alias obj='jf "{%**s}"'
然后您可以使用它们这样做
str 1
# "1"
arr 1 2 3
# [1,2,3]
obj one 1 two 2 three 3
# {"one":1,"two":2,"three":3}
obj 1 2 3 $(arr 4 $(str 5))
# {"1":2,"3":[4,"5"]}
Rust 库
let json = match jf::format(["%q", "JSON Formatted"].map(Into::into)) {
Ok(value) => value,
Err(jf::Error::Jf(e)) => bail!("mytool: {e}"),
Err(jf::Error::Json(e)) => bail!("mytool: json: {e}"),
Err(jf::Error::Yaml(e)) => bail!("mytool: yaml: {e}"),
};
依赖项
~2.5MB
~51K SLoC