我将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本身有什么可以生成随机的东西或计数器吗?
答案 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
}