如何在Perl中使用不同的随机值多次替换相同的字符串?

时间:2010-10-06 13:36:53

标签: regex perl bash

我正在使用这个Perl单行程序(在bash中)在给定文件中成功替换一个随机字符串:

perl -pi -e "s/replace\ this/`</dev/urandom tr -dc A-Za-z0-9 | head -c64`/g" example.php

但是,我不知道如何用不同的随机字符串替换几个“替换”。

2 个答案:

答案 0 :(得分:10)

perl -pi -e 's/replace this/join "", map { ("a" .. "z", "A" .. "Z", 0 .. 9)[rand(62)] } 1 .. 64/eg' example.php

让我们把它分解成碎片。

("a" .. "z", "A" .. "Z", 0 .. 9)

是一个列表,其中包含您希望在随机字符串中的字符。

[rand(62)]

这是在随机位置索引上面的列表(使用rand函数)。 62对应于列表中的项目数。 rand函数返回一个介于0和你给它的数字减去1之间的数字。令人高兴的是,数组和列表在Perl 5中从零开始索引,因此这非常有效。因此,每次运行这段代码时,您都会从可接受的字符列表中获得一个随机字符。

map将代码块和列表作为参数。它运行代码块并返回传递给它的列表中的每个项目的结果。列表为1 .. 64,因此代码块将运行64次。由于代码块包含生成随机字符的代码,因此map函数的结果是64个随机字符。

join函数采用分隔符和列表,并将列表作为由分隔符分隔的字符串返回(例如join ",", "a", "b", "c"返回"a,b,c")。在这种情况下,我们使用一个空字符串作为分隔符,因此它只生成一个由列表中的字符组成的字符串(即64个随机字符)。

现在我们准备好了解替代品。它查找字符串/g的每个实例(因为"replace this"选项)并在替换端运行代码(因为/e选项)并替换字符串{{1使用替换方执行的最后一个语句的值(在这种情况下,返回值为"replace this")。

答案 1 :(得分:0)

那么为什么不写剧本

#!/bin/bash
for replace in "replace this" "replace that"
do
   rand=$(generate random here  using /dev/urandom )
   sed -i "s/$replace/$rand/" file
done