#random-string #random #string #character-set #dsl #foo-bar #regex

bin+lib rngstr

一个用于生成具有自定义选项和简单领域特定语言的随机字符串的 CLI 工具

4 个版本 (2 个重大更新)

0.3.0 2024 年 5 月 30 日
0.2.0 2024 年 5 月 7 日
0.1.1 2024 年 4 月 29 日
0.1.0 2024 年 4 月 28 日

文本处理 中排名 #231

Download history 281/week @ 2024-04-26 118/week @ 2024-05-03 11/week @ 2024-05-10 3/week @ 2024-05-17 88/week @ 2024-05-24 48/week @ 2024-05-31 6/week @ 2024-06-07 3/week @ 2024-06-14 6/week @ 2024-07-05

每月下载量 232

MIT 许可证 MIT

44KB
928

rngstr

一个用于生成具有自定义选项和简单领域特定语言的随机字符串的 CLI 工具。

目录

安装

cargo install rngstr

使用方法

rngstr [OPTIONS]

选项

  • -l, --长度<LENGTH>:

  • -c, --custom <CUSTOM>: 指定一个自定义字符字符串(例如 abc01111

  • --regex <REGEX>: 指定用于生成字符集的正则表达式模式(例如 [0-9A-F] 将生成 0123456789ABCDEF 字符集)

  • -g, --group <GROUP>...: 指定一组字符串(例如 "foo" "bar" "baz" 将生成 "bar")

  • -p, --prefix <PREFIX>: 指定要添加到生成的字符串的前缀字符串

  • -s, --suffix <SUFFIX>: 指定要附加到生成的字符串的字符串

  • -r, --repeat <REPEAT>: 指定字符串应生成的次数

  • -d, --dsl <DSL>...: 指定源文件路径作为第一个参数,以及可选的目标文件路径作为第二个参数(如果未指定,则输出到终端)

  • --no-copy: 不要将生成的结果复制到剪贴板

  • --no-print: 不要打印生成的结果

  • --password: 使用密码字符集(A-Z,a-z,0-9和特殊字符)

  • -t, --trailing-suffix: 将尾部后缀生成设置为true

  • -h, --help: 打印帮助信息(查看-h选项的摘要)

  • -V, --version: 打印版本

默认值

默认情况下,rngstr 使用以下设置生成随机字符串

  • 字符集 = [A-Za-z0-9]
  • 长度 = 0
  • 复制到剪贴板 = true
  • 打印 = true
  • 后缀 = ""
  • 前缀 = ""
  • 重复 = 1

示例

rngstr --regex [0-9a-z] -l 8 -s ", " -r 3 
ln4hc1fk, srr9p704, ono7y09k 

rngstr --range 0..60 -s ", " -r 8 --trailing-suffix
6, 2, 5, 41, 33, 25, 3, 21,

rngstr -c 0001 -l 8 -p "0b" -s " " -r 3 
0b00000010 0b01100010 0b00001000

DSL 使用

过程声明

命令

基本

!<name>: [OPTIONS]

示例

!foo: --regex [0-9] -l 8

带参数的示例

!<name><parameters...>: [OPTIONS]

示例

!foo<start, end>: --range start..end

基本

!<name>:(<text>) 

示例

!foo:(!bar())

带参数的示例

!<name><parameters...>:(<text>)

示例

!foo<x, y, z>:(!bar<z>() !baz<x, y>()) 

过程调用

在第一行非声明行(不以!开头的修剪行)之后,你可以使用以下语法调用声明的过程

基本

!<name>()

示例

!foo()

带有占位符 $

!<name>($)

示例

!foo($)

你还可以在一个调用中多次使用占位符,其中每个 $ 都将生成相同的字符串

示例

!foo: -c 012 -l 4
-
!foo($ $ $ $)

输出

-
2211 2211 2211 2211

使用逗号 , 分隔参数

!<name><arguments...>()

示例

!foo<x, y, z>()

如果我们在过程声明过程体中的第一个 : 之后调用子串,过程体内部参数的每个出现都将被过程调用中解析的参数替换。可以将过程名作为参数传递,并在过程体内部调用它

示例

!array<procedure, length>:([!repeat<length, ", ">(!procedure())])
!foo: --regex [a-z0-9] -l 8
!foo_str:("!foo()")

{
    "array": !array<foo_str, 4>()
}

输出

{
    "array": ["2r4xtqv0", "t9na5pn0", "p1nbqvra", "c6hhww19"]
}

或者

{
    "array": !array<array<array<foo_str, 2>, 2>, 2>()
}

输出

{
    "array": [[["mw4kghh2", "qk2htxp2"], ["4s7g0z9n", "a1cszc89"]], [["xlcyhv4x", "ds4b351r"], ["pylnsvuu", "kny0h3a3"]]]
}

内置函数

可以通过调用它们的名字来使用这些过程,并且可以通过声明具有它们名字的另一个过程来覆盖它们。

cmd<字符串>

执行一个命令并返回结果。

示例

!cmd<"--group foo bar baz">()

输出

foo

repeat<count, suffix>

重复指定次数的过程,每个结果之间由给定的后缀分隔。

示例

!repeat<4, ", ">(!cmd<"--range 0..100">())

输出

23, 67, 4, 91

array<过程,长度>

通过重复指定次数的过程来创建一个数组。

示例

!array<usize<0, 100>, 5>()

输出

[23, 67, 4, 91, 45]

array_fill<元素,长度>

创建一个填充有指定元素并重复指定次数的数组的数组。

示例

!array_fill<42, 5>()

输出

[42, 42, 42, 42, 42]

!id<tag>

在散列表中添加条目,将标记作为键,0作为初始值,每次调用时增加。由于并行解析,数字不是有序生成的。

示例

!array<id<a>, 10>()
!array<id<b>, 10>()
!array<id<a>, 10>()

输出

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

!group<items...>

随机返回指定的一个项目

示例

!group<foo, bar, baz>()
!group<foo, bar, baz>()

输出

foo
baz

数字类型

所有Rust数值类型都支持在指定范围内或未指定范围内生成随机值。

示例

[!u8<0, 10>(), !u16<0, 10>(), !u32<0, 10>(), !u64<0, 10>(), !u128<0, 10>(), !i8<0, 10>(), !i16<0, 10>(), !i32<0, 10>(), !i64<0, 10>(), !i128<0, 10>(), !f32<0, 10>(), !f64<0, 10>(), !usize<0, 10>(), !isize<0, 10>(), !id<0>()]
[!u8(), !u16(), !u32(), !u64(), !u128(), !i8(), !i16(), !i32(), !i64(), !i128(), !f32(), !f64(), !usize(), !isize()]

输出

[3, 7, 4, 8, 9, 4, 7, 3, 1, 4, 6.409465, 1.9037502953455854, 3, 5, 0]
[169, 8026, 3981710656, 15859526283082379939, 294250989955636718152642071911969640664, 114, -11975, 862154430, -650703279019604957, 104795060125221781861534722358106096176, 0.46059388, 0.8589771759897691, 13709073818113593800, 5359762487833681572]

DSL 示例

rngstr --dsl foo.txt bar.json 

foo.txt

!foo: --regex [0-9A-Z] -l 8 -s ",\n    "  -r 9
!bar: --range 0..99         -s ", "       -r 4

{
    !foo("$": {
        "_$_": [!bar()]
    })
}

bar.json

{
    "H3IM3O66": {
        "_H3IM3O66_": [67, 86, 36, 61]
    },
    "QHZB5NMC": {
        "_QHZB5NMC_": [49, 24, 93, 77]
    },
    "JK2MSTAU": {
        "_JK2MSTAU_": [85, 86, 41, 56]
    },
    "GZA0V753": {
        "_GZA0V753_": [23, 19, 93, 24]
    },
    "79XOI38K": {
        "_79XOI38K_": [57, 61, 41, 3]
    },
    "0U2H5RLP": {
        "_0U2H5RLP_": [75, 72, 73, 63]
    },
    "8DLY976J": {
        "_8DLY976J_": [88, 38, 3, 64]
    },
    "5PU1MQW3": {
        "_5PU1MQW3_": [72, 27, 4, 30]
    },
    "IVG57ISE": {
        "_IVG57ISE_": [17, 37, 9, 43]
    }
}

foo.txt

!foo_group:(foo, bar, baz)
!dq<proc>:("!proc()")

{
    "group": !array<dq<group<!foo_group()>>, 5>()
}

bar.json

{
    "group": ["foo", "baz", "bar", "foo", "foo"]
}

rngstr --dsl foo.txt bar.ron

foo.txt

!str:("!cmd<--regex [a-z] -l !usize<3, 9>()>()")
!rgba:(Rgba(!repeat<4, ", ">(!u8())))
!ida:("a!id<a>()")
!bool:(!group<true, false>())

( 
    foo: {
        !repeat<5, ",\n\t\t">(!str(): (
            x: !f32(),
        ))
    },
    bar: [
        !repeat<5, ",\n\t\t">((
            t: !rgba(),
            u: !ida(),
            v: !bool(),
        ))
    ],
)

bar.ron

( 
    foo: {
        "dxpln": (
            x: 0.7885895,
        ),
        "yaqdg": (
            x: 0.48093498,
        ),
        "hungukuf": (
            x: 0.9161161,
        ),
        "qtfnkeve": (
            x: 0.9836798,
        ),
        "dqedis": (
            x: 0.42920595,
        )
    },
    bar: [
        (
            t: Rgba(217, 101, 149, 83),
            u: "a0",
            v: true,
        ),
        (
            t: Rgba(209, 48, 76, 67),
            u: "a1",
            v: true,
        ),
        (
            t: Rgba(62, 167, 240, 81),
            u: "a2",
            v: false,
        ),
        (
            t: Rgba(251, 139, 57, 219),
            u: "a3",
            v: false,
        ),
        (
            t: Rgba(146, 106, 246, 52),
            u: "a4",
            v: false,
        )
    ],
)

rngstr --dsl foo.txt bar.txt 

foo.txt

!foo: --regex [0-2] -l 4 
!bar: --regex [7-9] -l 4
1: !foo()
2: !foo($)
3: !foo($ !foo())
4: !foo($ !bar())
5: !foo($ !bar($))
6: !foo(\$ !bar($))
7: \!foo($ !bar($))
8: \!foo($ \!bar($))

bar.txt

1: 2220
2: 0101
3: 0020 2201
4: 2022 9777
5: 0220 7879
6: $ 8897
7: !foo($ 7988)
8: !foo($ !bar($))

rngstr --dsl foo.txt bar.txt

foo.txt

!foo: -c 012 -l 4 
!r4:  -r 4 -s "\"" 

1: !foo() !foo() !foo() !foo()
2: !foo($ $ $ $)
3: !foo( abcd )
4: !r4(!foo())
5: !r4($ $ $ $)
6: !foo(!foo(!foo(!foo())))
7: !foo($ !foo($ !foo($ !foo())))

bar.txt

1: 1122 0212 1222 0202
2: 2211 2211 2211 2211
3: 0021 abcd 
4: 2021"1212"2201"1110
5:    "   "   "   
6: 0002
7: 0112 1220 2022 0201

依赖项

~5–17MB
~236K SLoC