在sed的'/'中生成一个随机数/字符串或迭代器

时间:2013-06-07 09:23:37

标签: bash sed

我将Jan Goyvaerts's e-mail regex改为要在管道中使用的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本身有什么可以生成随机的东西或计数器吗?

3 个答案:

答案 0 :(得分:6)

这可能适合你(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

答案 1 :(得分:2)

我尝试了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.com\nsome.other@email.co.uk\nwhatever@man.biz\nsed@sed.com\n'
echo -e "before:\n${test_data}"
echo -e "after: \n${test_data}" | remove_emails

答案 2 :(得分:1)

您可以通过在sed循环中反复调用while来执行此操作,如下所示:

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
}