Как я могу заменить одну и ту же строку несколько раз разными случайными значениями в Perl? - PullRequest
3 голосов
/ 06 октября 2010

Я использую этот однострочный Perl (в bash), чтобы успешно заменить строку случайной строкой в ​​данном файле:

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

Однако я не знаю, как заменитьнесколько "заменить это" различными случайными строками.

Ответы [ 2 ]

10 голосов
/ 06 октября 2010
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 возвращает число от нуля до указанного вами числа минус один.К счастью, массивы и списки индексируются начиная с нуля в Perl 5, так что это работает отлично.Таким образом, каждый раз, когда выполняется этот фрагмент кода, вы получаете один случайный символ из списка допустимых символов.

map принимает блок кода и список в качестве аргументов.Он запускает блок кода и возвращает результат для каждого элемента в списке, переданном ему.Список 1 .. 64, поэтому блок кода будет выполняться шестьдесят четыре раза.Поскольку в блоке кода содержится код, который генерирует случайный символ, результатом функции map является шестьдесят четыре случайных символа.

Функция join принимает разделитель иlist и возвращает список в виде строки, разделенной разделителем (например, join ",", "a", "b", "c" возвращает "a,b,c").В этом случае мы используем пустую строку в качестве разделителя, поэтому она просто создает строку, состоящую из символов в списке (то есть шестьдесят четыре случайных символа).

Теперь мы готовы взглянуть назамена.Он ищет каждый экземпляр (из-за опции /g) строки "replace this" и запускает код на стороне замены (из-за опций /e) и заменяет строку "replace this" значением последнегооператор, выполняемый на стороне замены (в данном случае возвращаемое значение join).

0 голосов
/ 06 октября 2010

Тогда почему бы не написать скрипт

#!/bin/bash
for replace in "replace this" "replace that"
do
   rand=$(generate random here  using /dev/urandom )
   sed -i "s/$replace/$rand/" file
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...