使用sed,awk,grep转换文本

时间:2013-11-06 20:10:42

标签: linux bash sed awk grep

我无法解决问题。我有一个包含电子邮件地址的文本。我需要这个文件来按英镑符号更改地址。

例如:

bla bla bla example{at sign}gmail.com - > #######{at sign}#####.###

4 个答案:

答案 0 :(得分:0)

您可以像这样使用sed:

sed -r 's/(^| )[^ @]+@[^ ]+/\1#########@#####.###/g' file
Each message has exactly one header, which is structured into fields. #########@#####.### Each field has a name and a value. #########@#####.### RFC 5322 specifies the precise syntax #########@#####.### .

答案 1 :(得分:0)

问题是您如何知道您是否有电子邮件地址。您可以假设/[\.\w]+@[\.\w]+\.\w+/等模式,但可能包含电子邮件之外的其他内容。您想保持长度,还是一般性地替换它:

  • david@foo.com => #####@###.###
  • robert.brown@buffy.fu => ############@#####.##

  • david@foo.com => #################@##################.###
  • robert.brown@buffy.fu => #################@##################.###

后者可能使用s/[\.\w]+@[\.\w]+\.\w+/#################@##################.###/ sed。请注意sed因系统而异 - 尤其是它可以接受的正则表达式语法类型。 sed可以使用至少三种不同类型的正则表达式:过时(或 RE Classic ),Modern(包括一些扩展)和Extended(如Perl和Python)


在Mac OS X上测试 - Mavericks

sed -E 's/\s*[[:alnum:]\.]+@[[:alnum:]\.]+\.[[:alnum:]]+\s*/######@#####.###/g' rfc-5322.txt

我在RFC-5322

上测试了这个

答案 2 :(得分:0)

这是awk解决方案

echo "test my@email.com vow" | awk  '{split($0,a,"@");f=split(a[1],x," ");for (i=1;i<=(length($f));i++) s=s "#";$f=s}1'
test ############ vow

它会保留长度,但可能会破坏任何非电子邮件且@

的内容

对于多封电子邮件,这可能会更好:

awk '{gsub(/[^@ ]+@[[:alnum:]]+.[[:alnum:]]+/,"#########")}1' file

答案 3 :(得分:0)

一个丑陋的oneliner,它将改变文件:

$ cat text
Each message has exactly one header, which is structured into fields. firstemail@gmail.com Each field has a name and a value. secondmail@gmail.com RFC 5322 specifies the precise syntax thirdmail@gmail.com
$ < text egrep -o "\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}\b"  | sort -u | ( while read b ; do echo "s/$b/$(tr a-z0-9_%+-. \# <<< ${b%@*})@$(tr a-z0-9_%+- \# <<< ${b#*@})/g" ; done ) | xargs -n1 -I{} sed -i,bak {} text
$ cat text
Each message has exactly one header, which is structured into fields. ##########@#####.### Each field has a name and a value. ##########@#####.### RFC 5322 specifies the precise syntax #########@#####.###

我从here收到了电子邮件regexp。我还假设电子邮件左侧的一个点也应该被混淆:first.name@gmail.com --> #########@#####.###