在 SED 's/'中生成随机数/字符串或迭代器



我将Jan Goyvaerts的e-mail正则表达式改编为一个bash函数,用于管道中匿名化电子邮件地址:

function remove_emails { 
    sed -r "s|b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b|email.address@removed.com|gI"; 
}

我在bash管道中使用:

    mysqldump 
        -uuser 
        -ppass 
        db_name 
    | remove_emails 
    | gzip -c 
    | cat 
    > tmp.sql.gz

很好,但是现在,我想有不同的随机电子邮件,我满意的是:

email.address1@removed.com
email.address2@removed.com

eiyyzhupzftrvjwehbqp@removed.com
kwmbrshzmxqlrqatqpff@removed.com

或任何不同且唯一的

我对bash很满意,但是使用计数器,进程替换等失败,因为sed只调用一次,所以

sed "s,sth,$(echo $RANDOM),g"

和类似的不能工作,

是否有任何东西来生成随机的东西或计数器在sed本身?

这可能适合您(GNU sed):

<<<'Here is a random number.' sed 's/random number/& $RANDOM/;s/.*/echo "&"/e' 

或者

<<<'Here is a random number.' sed 's/random number/& $RANDOM/;s/.*/echo "&"/' | sh

我尝试了potong的正确答案,并找到了一种实现迭代器的方法来回答我问题的另一部分:

remove_emails() {
    sed -r 's|b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b|test$(( iterator++ ))@example.com|gI;s|.*|echo "&"|' | bash
}
iterator=0
test_data='some.e.mail.address.@domain.comnsome.other@email.co.uknwhatever@man.biznsed@sed.comn'
echo -e "before:n${test_data}"
echo -e "after: n${test_data}" | remove_emails

您可以通过在while循环中重复调用sed来实现,如下所示:

remove_emails() { 
    while read line
    do
        sed -r "s|b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b|email.address${RANDOM}@removed.com|gI" <<< "$line"
    done
}

最新更新