我怎样才能得到;sed";删除除电子邮件地址以外的所有内容。

我怎样才能得到;sed";删除除电子邮件地址以外的所有内容。,sed,Sed,如何让“sed”删除除电子邮件地址以外的所有内容 db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com 使用sed: $ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com se

如何让“sed”删除除电子邮件地址以外的所有内容

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

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com 
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
使用
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
请注意,上述工作在以下假设下进行:

  • 电子邮件地址前有一个空格
  • 电子邮件地址本身没有空格
  • 该行中有一个电子邮件地址(它实际上只会收到第一个,因此可以处理多个电子邮件地址)
  • 本地部分(在
    @
    之前)仅包含字母(小写或大写)、数字和一个点

扩展字符集(
[a-zA-Z0-9.]
)以减少限制-例如,您可以执行
[a-zA-Z0-9.-\u]
以包括
-

以下操作,无论电子邮件地址在行中的哪个位置,但仅当每行有一个电子邮件地址时才有效。如果有多个,则只显示行中的最后一个。它也不会触及那些没有有效电子邮件地址的行

sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/'
输入 输出
它一定要被屏蔽吗?格雷普呢?下面是如何将它与您提供的正则表达式一起使用:

$ 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
$cat dbdump.txt

数据库转储:someusername:::kRW…0fPc::$2a$10$…aucvkDt86:::joesmith@gmail.com 另一行上有两个电子邮件地址--bob@example.org $grep-eio'\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
使匹配项不区分大小写。它甚至可以在同一行中找到多个电子邮件地址


编辑:我无法抗拒
-eio
。我想
grep-Eio
egrep-io
也可以工作…

这需要GNU
sed

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com 
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
  • 拆分输入行,以便用换行符分隔电子邮件地址和其他字符串
  • 擦除仅由换行符或输入行的开头或结尾分隔的非@字符组成的序列
  • 删除多余的换行符和空行

这些电子邮件地址是在单独的行中,还是可以是类似于此用户的电子邮件的句子foo@example.com
?欢迎来到堆栈溢出!一些示例数据会有很大帮助。db dump:someusername:::kRW…0fPc:::$2a$10$…aucvkDt86:::joesmith@gmail.com忽略(…),只是为了保护隐私删减字符串不起作用,只针对带有电子邮件的行。对不起,我的错误,应该添加不是所有的行都有电子邮件或以下之间的所有元素::“有没有办法让这个正则表达式“\b[A-Z0-9.\u%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}\b”与sed一起工作?其中sed删除除此之外的所有内容,并在每个内容之后添加一个“/r”返回?请参见编辑。至于你给出的正则表达式,你应该能够使用类似于:
\b\([A-Z0-9.\uz0%+-]\+@[A-Z0-9.-]\+\.[A-Z]{2,4}\)\b
来获得第一组(
s/..\1/
-
\1
是第一组)。你需要逃避
\+
。你所有的假设都是正确的,我仍然没有得到一个明确的结果。