Regex 如何使用sed或awk用相应的数字表示替换一些元音?

Regex 如何使用sed或awk用相应的数字表示替换一些元音?,regex,sed,awk,Regex,Sed,Awk,如果文件包含多个(数百万)电子邮件地址,是否可以应用此转换 a->4, e->3, i->1, o->0 是否显示所有电子邮件地址?比如说 test@example.com被替换为t3st@3x4mpl3.c0m 我已经花了很多时间和精力,但发现用我的sed和regex技能是不可能完成的。 这不是学校的活动,只是开源软件时的隐私问题 假设数据是一个包含数百万电子邮件地址的日志文件。请使用以下命令: $ tr 'aeio' '4310' <<< "te

如果文件包含多个(数百万)电子邮件地址,是否可以应用此转换

a->4, e->3, i->1, o->0 
是否显示所有电子邮件地址?比如说

test@example.com
被替换为
t3st@3x4mpl3.c0m

我已经花了很多时间和精力,但发现用我的sed和regex技能是不可能完成的。 这不是学校的活动,只是开源软件时的隐私问题

假设数据是一个包含数百万电子邮件地址的日志文件。

请使用以下命令:

$ tr 'aeio' '4310' <<< "test@example.com"
t3st@3x4mpl3.c0m

您可以使用
awk

cat file
this is a test here is an email my.test@email.com not this
Here are two email my@post.com and not.my@gmail.org
None here
awk '{for (i=1;i<=NF;i++) if ($i~/\./ && $i~"@") {gsub(/a/,"4",$i);gsub(/e/,"3",$i);gsub(/i/,"1",$i);gsub(/o/,"0",$i)}}1'
this is a test here is an email my.t3st@3m41l.c0m not this
Here are two email my@p0st.c0m and n0t.my@gm41l.0rg
None here
然后使用
awk

cat file
this is a test here is an email my.test@email.com not this
Here are two email my@post.com and not.my@gmail.org
None here
awk '{for (i=1;i<=NF;i++) if ($i~/\./ && $i~"@") {gsub(/a/,"4",$i);gsub(/e/,"3",$i);gsub(/i/,"1",$i);gsub(/o/,"0",$i)}}1'
this is a test here is an email my.t3st@3m41l.c0m not this
Here are two email my@p0st.c0m and n0t.my@gm41l.0rg
None here
awk'{for(i=1;i使用
bash扩展解决方案以仅修改电子邮件地址:

#!/bin/bash

while read -ra words; do
    for word in "${words[@]}"; do
        if [[ $word =~ ^.+@.*$ ]]; then
            modwords+=( $(tr 'aeio' '4310' <<< $word) )
        else 
            modwords+=( $word )
        fi
    done 
    echo "${modwords[@]}"
    modwords=()
done < inputFile
您可以将输出重定向到另一个文件或执行
tmp&&mv tmp inputFile

sed 'y/aeio/4310/' YourFile 


Tr会快得多,但是如果你只使用sed…

那是什么
Tr
?而且
我猜你不能在一个文件中使用'Tr'@aelor-Tr来替换所有的电子邮件地址。如果你可以接受一个输入,你显然可以接受一个输入文件。如果你非常紧张d、 边读边用line@user000001你很快就会意识到,能够看到被删除的帖子通常是很有趣的。顺便说一句,如果你真的担心隐私问题,那么你所考虑的机制是很容易扭转的。这个文件有没有其他东西,而不是电子邮件,不需要转换?或者只有电子邮件?我会对辅音的th做同样的事情en@Jotne,是的,这是Syslog的日志文件更新了我的帖子,只更改电子邮件而不更改其他内容。您为我节省了数小时的时间,这并不像看起来那么简单,谢谢you@Sloin不客气。更新了一些关于它如何工作的信息。你可以扩展到任何你喜欢的信。最后想一想,你愿意这样做吗e对于不以空格分隔的电子邮件事件,如“attribute=”,也一样?我认为使用NF循环不能做到这一点,对吗?+1,但是
[[$word=~@]
(正则表达式没有锚定,因此不需要
*
)甚至
[[$word=*@]]
就足够了,后者可能也快一点。谢谢@AdrianFrühwirth,说得好。虽然它可能会更新twitter句柄。
:)
。怎么样
^.+.*$
?同意,但我至少会使用
^.+.+[.].+$
以确保有一个
域。tld
部分:)应该注意的是,将电子邮件地址与正则表达式匹配通常不是一个好主意,因为符合RFC的正则表达式非常庞大,这导致许多网站对愚蠢的验证器过于严格:(是的。使用perl这样的成熟语言最好使用他们的电子邮件解析模块。
sed 'y/aeio/4310/' YourFile