我将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
}