如何在 Bash 中生成由正则表达式给出的字符串并通过管道传输它到另一个命令?
例如:
> $RANDOM | regex "{abcdef\d}[8]" | grep "1{3}" | less
我没有找到哪个实用程序可以基于正则表达式特殊
正则表达式是输入。我想找到一个基于正则表达式生成字符串的实用程序。
例如:
$ regex "{abcdef\d}[8]" -n 10 b8789a62 97303666 8b536c28 79590607 6d80ad60 78d36ded aa001d9a 8826f276 df1e1f7a 854307db
两个限制:
- 允许重复运算符生成给定文本的次数受到某些内部(不可见)数字的限制
- 生成的字符串的数量受到用户给出的数量的限制。
答案1
要获得每行都有八个小写十六进制数字的行流,您可以使用
tr -c -d '0-9a-f' </dev/random | fold -w 8
这会读取/dev/random
并删除我们不感兴趣的所有字符tr
。 fold
然后用于将流切割成八个字符的行。
修改tr
选择表达式以选择任何其他字符集。修改fold
长度以获得更长或更短的字符串。grep
如果您想从生成的字符串中挑选出满足其他条件的字符串,请向管道添加一个阶段,例如,使用grep 111
仅允许包含三个连续1
.
答案2
对于仅打印随机 32 位十六进制数字的特定示例,您也可以使用od
or hexdump
on /dev/urandom
:
$ od -w4 -An -vtx4 -N40 /dev/urandom
f0c37f96
e5dc1143
ebc9cd59
7fe573da
3622c662
e7bc0013
5f9e2017
79a6ccff
4dd1d41d
a6957940
$ hexdump -e '"%08x\n"' -n40 /dev/urandom
9f739176
e13a816f
0860c351
42bf86e7
c810ab07
1f42e7b9
d76b7016
10d2ac2c
b5ae6ca5
28089547
或者因为您在评论中提到了 bash 内置函数:
for ((i=0;i<10;i++)) {
printf "%08x\n" "$((RANDOM<<17^RANDOM<<2^RANDOM))"
}
(该语法实际上来自 ksh(尽管 ksh 最初没有printf
内置),并且在 zsh 和 bash 中也可用)。
$RANDOM
是一个15位的伪随机数。较新的版本bash
也有$SRANDOM
一个 32 位整数,它也更加随机,所以在这些版本中,您可能更喜欢:
for ((i=0;i<10;i++)) {
printf "%08x\n" "$SRANDOM"
}
现在,作为对您的问题的更直接的回答,对于这样一个简单的正则表达式,您可以使用String::Random
模块perl
(在libstring-random-perl
基于 Debian 的发行版的包中):
$ perl -MString::Random=random_regex -le 'print random_regex("[0-9a-f]{8}") for 1..10'
e785f800
264a131c
c7bcb74e
26d6c169
d5e169df
210ac1c0
616e651d
badf8131
50c15bb5
93e2b2a5
(请注意,正如文档中所述,这不是真正的正则表达式;对任意正则表达式执行此操作将非常困难并且不是特别有用)。