Regex 如何在Perl中用不同的随机值多次替换同一字符串?
我使用这个Perl one liner(在bash中)成功地将给定文件中的字符串替换为随机字符串:Regex 如何在Perl中用不同的随机值多次替换同一字符串?,regex,perl,bash,Regex,Perl,Bash,我使用这个Perl one liner(在bash中)成功地将给定文件中的字符串替换为随机字符串: perl -pi -e "s/replace\ this/`</dev/urandom tr -dc A-Za-z0-9 | head -c64`/g" example.php perl-pi-e“s/replace\this/` 让我们把它分成几部分 ("a" .. "z", "A" .. "Z", 0 .. 9) 是一个列表,其中包含要在随机字符串中的字符 [rand(62)] 这
perl -pi -e "s/replace\ this/`</dev/urandom tr -dc A-Za-z0-9 | head -c64`/g" example.php
perl-pi-e“s/replace\this/`
让我们把它分成几部分
("a" .. "z", "A" .. "Z", 0 .. 9)
是一个列表,其中包含要在随机字符串中的字符
[rand(62)]
这是在随机位置对上面的列表进行索引(使用函数).62对应于列表中的项目数。rand函数返回一个介于0和您给它的数字减1之间的数字。令人高兴的是,在Perl 5中,数组和列表的索引从0开始,因此这是完美的。因此,每次运行这段代码时,您都会从可接受的列表中获得一个随机字符莱克特斯
将代码块和列表作为参数。它运行代码块并返回列表中每个项目的结果。列表为1..64
,因此代码块将运行64次。由于代码块包含生成随机字符的代码,map
函数的结果为60-f我们的随机字符
函数接受一个分隔符和一个列表,并将列表作为由分隔符分隔的字符串返回(例如,连接“,”,“a”,“b”,“c”
返回“a,b,c”
)。在这种情况下,我们使用一个空字符串作为分隔符,因此它只生成一个由列表中的字符组成的字符串(即64个随机字符)
现在我们准备看一下替换。它查找字符串“replace this”
的每个实例(因为/g
选项),并在替换端运行代码(因为/e
选项)并替换字符串“replace this”“
替换端执行的最后一条语句的值(在本例中是join
的返回值)。那么为什么不编写脚本呢
#!/bin/bash
for replace in "replace this" "replace that"
do
rand=$(generate random here using /dev/urandom )
sed -i "s/$replace/$rand/" file
done
rand返回一个浮点数>=0和<您传递的参数(默认为1)。仅仅因为数组索引是一个整数contex,它才会变成一个从0到参数减1的整数。这不是OP的解决方案,他希望用不同的随机字符串替换单个模式的每次出现。这段代码将用每个模式获得不同的随机字符串来替换第一次出现的多个模式。
#!/bin/bash
for replace in "replace this" "replace that"
do
rand=$(generate random here using /dev/urandom )
sed -i "s/$replace/$rand/" file
done