除了电子邮件地址,我怎样才能“删除”其他所有内容。

时间:2010-12-14 01:48:58

标签: sed

我怎么得到“sed”除了电子邮件地址之外的所有其他内容。

db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com

4 个答案:

答案 0 :(得分:20)

它必须是sed吗? grep怎么样?以下是如何将它与你给出的正则表达式一起使用:

$ cat dbdump.txt 
db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com
another line with two e-mail addresses <test@example.com> on it -- bob@example.org

$ grep -EiEio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b' dbdump.txt
joesmith@gmail.com
test@example.com
bob@example.org

-o标志仅打印匹配的部分,即仅打印电子邮件地址。 -i使匹配大小写不敏感。它甚至可以在同一行找到多个电子邮件地址。

编辑:我无法抗拒-EiEio。我想grep -Eioegrep -io也会有用......

答案 1 :(得分:0)

使用sed

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com 

使用awk

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|awk '{print $NF}'

编辑:鉴于您评论中的新信息 - 很难按照您的要求进行操作,而且没有任何规律性。检查语法部分:

标准说,例如1$%3{C}@example.com是有效的电子邮件地址(信不信由你)。你甚至可以引用它(文章中给出的例子是John Doe@example.com)。因此,遵循标准,几乎不可能识别有效的电子邮件。

如果您限制搜索,则可以例如首先通过以下方式提取包含@的行:

cat your-file.txt|grep @

然后做一些上面的事情。你甚至可以这样做:

$ echo "garbage John.Doe123@example.com garbage"|sed 's/[^@]* \([a-zA-Z0-9.]*@[^ ]*\).*/\1/'
John.Doe123@example.com

请注意,上述内容在以下假设下有效:

  • 电子邮件地址前有空格
  • 电子邮件地址本身没有空格
  • 该行中有一个电子邮件地址(它实际上只会获得第一个,因此可以使用多个电子邮件地址)
  • local-part@之前的所有内容)仅包含字母(小写或大写),数字和点

扩展字符集([a-zA-Z0-9.]),以便减少限制 - 例如您可以[a-zA-Z0-9.-_]加入-_

答案 2 :(得分:0)

如果电子邮件地址在该行的哪个位置,则以下内容将起作用,但如果每行有一个电子邮件地址,则。如果有多个,它只会显示该行中的最后一个。它也不会触及那些没有有效电子邮件地址的行

sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/'

输入

$ cat dbdump
this line with no valid @ email address is untouched
::: a0$...aucvkDt86 ::: joesmith@gmail.com
::: a0$... foo@example.com db dump: someusername :::

输出

$  sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/' ./dbdump
this line with no valid @ email address is untouched
joesmith@gmail.com
foo@example.com

答案 3 :(得分:0)

这需要GNU sed

sed -r 's/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/\n&\n/ig;s/(^|\n)[^@]*(\n|$)/\n/g;s/^\n|\n$//g;/^$/d' inputfile
  • 拆分输入行,以便电子邮件地址和其他字符串由换行符分隔
  • 擦除仅包含由换行符或输入行开头或结尾分隔的非@字符的序列
  • 删除额外的换行符和空行