在 bash 中从正则表达式生成字符串

在 bash 中从正则表达式生成字符串

如何在 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. 允许重复运算符生成给定文本的次数受到某些内部(不可见)数字的限制
  2. 生成的字符串的数量受到用户给出的数量的限制。

答案1

要获得每行都有八个小写十六进制数字的行流,您可以使用

tr -c -d '0-9a-f' </dev/random | fold -w 8

这会读取/dev/random并删除我们不感兴趣的所有字符trfold然后用于将流切割成八个字符的行。

修改tr选择表达式以选择任何其他字符集。修改fold长度以获得更长或更短的字符串。grep如果您想从生成的字符串中挑选出满足其他条件的字符串,请向管道添加一个阶段,例如,使用grep 111仅允许包含三个连续1.

答案2

对于仅打印随机 32 位十六进制数字的特定示例,您也可以使用odor hexdumpon /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

(请注意,正如文档中所述,这不是真正的正则表达式;对任意正则表达式执行此操作将非常困难并且不是特别有用)。

相关内容