2

我将Jan Goyvaerts 的电子邮件正则表达式改编为 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 本身有什么东西可以生成随机的东西或计数器吗?

4

3 回答 3

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
于 2013-06-08T07:14:53.020 回答
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
于 2013-06-09T16:53:54.613 回答
1

您可以通过sedwhile循环中重复调用来做到这一点,如下所示:

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
}
于 2013-06-07T09:51:59.327 回答