我怎样才能得到;sed";删除除电子邮件地址以外的所有内容。
如何让“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
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
也可以工作…这需要GNUsed
:
$ 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
是第一组)。你需要逃避\+
。你所有的假设都是正确的,我仍然没有得到一个明确的结果。