Bash grep 在第一个匹配处停止

标签 bash

<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="95e0e6f0e7acd5e1fae1f9bbf0edf4f8e5f9f0bbf6faf8" rel="noreferrer noopener nofollow">[email protected]</a>>, size=35020827, class=-30, nrcpts=1, msgid=<2m96JLQblfm/fh.01u3YnFYK0bc3pmOExg2vA.totl.example.com>, proto=ESMTP, daemon=MTA-v6, relay=lemur.totl.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7500061007444435061d1a1058171412065b100d14180519105b161a18" rel="noreferrer noopener nofollow">[email protected]</a>>, size=18071179, class=-30, nrcpts=1, msgid=<BhaYKoWuhDhrUQcT5.+tF6eKTCu0459KjSflNxLg.shoe-bags.example.com>, proto=ESMTP, daemon=MTA-v6, relay=dog.shoe-bags.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e095938592d2d3a09394858c8c8192cd908194928f8cce8598818d908c85ce838f8d" rel="noreferrer noopener nofollow">[email protected]</a>>, size=27057917, class=-30, nrcpts=1, msgid=<VaD1xW8SduAYImck.Mbx1MBcKTjBPlQpcaDhJRA.stellar-patrol.example.com>, proto=ESMTP, daemon=MTA-v6, relay=feinstein.stellar-patrol.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="552026302763152539343b302178302d25273026267b302d34382539307b363a38" rel="noreferrer noopener nofollow">[email protected]</a>>, size=15212380, class=-30, nrcpts=1, msgid=<4wN8i90XT.BIdywWoKxNjeEM1q.planet-express.example.com>, proto=ESMTP, daemon=MTA-v6, relay=fry.planet-express.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0376706671323a43616f6260686e6670622d667b626e736f662d606c6e" rel="noreferrer noopener nofollow">[email protected]</a>>, size=44656174, class=-30, nrcpts=1, msgid=<1froj29vndf7h0.Qzoi+1hDEQOVp1frnQvWO.blackmesa.example.com>, proto=ESMTP, daemon=MTA-v6, relay=barney.blackmesa.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="364345534404764542535a5a57441b46574244595a18534e575b465a531855595b" rel="noreferrer noopener nofollow">[email protected]</a>>, size=4556372, class=-30, nrcpts=1, msgid=<jnugzy+Z.L82rx1mhoSXi0RmK/yNP.stellar-patrol.example.com>, proto=ESMTP, daemon=MTA-v6, relay=feinstein.stellar-patrol.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9beee8fee9acdbf6faf8e9f4f3fae9ffb5fee3faf6ebf7feb5f8f4f6" rel="noreferrer noopener nofollow">[email protected]</a>>, size=35391498, class=-30, nrcpts=1, msgid=<fXr7+HM1U7ZpbJqxf.iJs6q9r.macrohard.example.com>, proto=ESMTP, daemon=MTA-v6, relay=corporate-mail-01.macrohard.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2a5f594f581d6a464b5d4b444e4b044f524b475a464f04494547" rel="noreferrer noopener nofollow">[email protected]</a>>, size=46296174, class=-30, nrcpts=1, msgid=<UJHE3Y4uEn.JBT3RESrNYL+fH5dFTGt5A.lawanda.example.com>, proto=ESMTP, daemon=MTA-v6, relay=achilles.lawanda.example.com
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f085839582c1c4b0969594949984de9588919d809c95de939f9d" rel="noreferrer noopener nofollow">[email protected]</a>>, size=12197030, class=-30, nrcpts=1, msgid=<gpq6lYSHHC67d.ZjyKUitfcPwOlA/OEc++.feddit.example.com>, proto=ESMTP, daemon=MTA-v6, relay=kittin.feddit.example.com

我希望只提取每行的电子邮件地址部分,例如 [email protected]

我目前正在使用这种技术:

cat file | grep -o 'user.*?com'

但是,由于“.com”位于行尾,有时我仍然会返回整行。

我的示例输出应类似于:

<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d5a0a6b0a7ec95a1baa1b9fbb0adb4b8a5b9b0fbb6bab8" rel="noreferrer noopener nofollow">[email protected]</a>
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d6a3a5b3a4e7e796a5beb9b3fbb4b7b1a5f8b3aeb7bba6bab3f8b5b9bb" rel="noreferrer noopener nofollow">[email protected]</a>
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d6a3a5b3a4e4e596a5a2b3babab7a4fba6b7a2a4b9baf8b3aeb7bba6bab3f8b5b9bb" rel="noreferrer noopener nofollow">[email protected]</a>
... etc

这怎么可能?非常感谢您的帮助

最佳答案

这应该做:

grep -o 'user[^[:space:]]\+\.com' file

观察我不需要 cat在这里。

这使用字符类 [:space:] 。我的意思是,我想要以 user 开头的所有内容。 ,以 .com 结尾并且在 ( [^[:space:]]\+ ) 之间仅包含非空格字符(且至少一个)。


关于您的解决方案:您需要 -P切换为grep使用 Perl 的正则表达式,这样 .*?被解释为非贪婪地匹配任何东西:

grep -Po 'user.*?com' file

可以。

现在我希望您没有任何客人发送电子邮件 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2e5b5d4b5c1a1c6e4d4141424d41435e4f494057004d4143" rel="noreferrer noopener nofollow">[email protected]</a>或类似的,否则这个会在这里失败,因为你只会得到 user42@coolcom :(

使用正则表达式解析电子邮件地址根本不是一项简单的任务。

关于Bash grep 在第一个匹配处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19745604/

相关文章:

bash - docker-compose 卷 "no such file or directory"

bash - 为什么 bash 的手册页在写入文件时有双字母?

linux - 在整个 Linux 文件系统中查找并替换文件/文件夹名称和内容

bash - 通过shell脚本IF条件在pig脚本中声明参数值

linux - 单行异或两个字符串?

linux - 过滤快照版本

java - 使用正则表达式任意安装 .jar 文件

linux - Bash shell 函数错误 : command not found

linux - bash中的“for option”和bash中的echo

linux - Bash:根据文件日期戳删除