我怎么得到“sed”除了电子邮件地址之外的所有其他内容。
db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com
答案 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 -Eio
或egrep -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