我正在使用这个Perl单行程序(在bash中)在给定文件中成功替换一个随机字符串:
perl -pi -e "s/replace\ this/`</dev/urandom tr -dc A-Za-z0-9 | head -c64`/g" example.php
但是,我不知道如何用不同的随机字符串替换几个“替换”。
答案 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