3

程序:命令提示符 (CMD) 批处理脚本

我有一个文件夹,里面有很多文件。在这些文件中,有许多电子邮件地址与其他杂项混合在一起。文字垃圾。我想要一种从每个文件中提取这些电子邮件地址并创建一个新文件 (.txt) 的方法,其中每个文件都尽可能清楚地列出。

我已经花了几个小时找到一个像样的正则表达式'代码':“ [.AZ-_] @[.AZ-_]

这个表达来自似乎令人惊讶的是谷歌可以检测到的关于这个主题的唯一其他论坛主题——我觉得这很令人震惊。该线程可以在这里找到: https ://stackoverflow.com/questions/7911482/extract-email-from-text-file-using-batch-job

在那个线程上,一些名叫Hand-E-Food的人创建了以下 .bat 脚本来从选定的文件/文件夹中提取电子邮件地址:

@Echo Off
For /F "tokens=*" %%A In ('FindStr /R /I "[\.A-Z\-_]*@[\.A-Z\-_]*" "results.txt"') Do Call :ExtractEmail "%%A"
Exit /B

:ExtractEmail
Set "Email=%~1"
Set "Email=%Email:*<=%"
Set "Temp=%Email:*>=>%"
Call Set "Email=%%Email:%Temp%=%%"
Echo %Email%>emails.txt
Exit /B

令人惊讶的是,他忽略了对他的代码进行完全错误测试,遗憾的是它不起作用 - 正如原始海报所提到的那样。恼人的是,他从来没有回应纠正他的错误,现在这个话题已经结束了。

这把我们带到了这里:一个新的话题,问同样的问题,本应在 2011 年回答,但没有。因此,如果任何人都可以帮助解决我认为可能是相当简单的代码,而我认为这是一种非常有用的能力,请向我们提供您的专业知识。

PS请不要像Hand-E-Food一样忽略仔细检查您的代码是否有效。此外,我在命令提示符方面有少量经验,但是许多查看此线程的用户将没有任何经验,因此请在您的代码中使用一些符号来解释 - 至少稍微解释一下 - 发生了什么。

记住:我们没有人知道我们现在所知道的一切,只有通过善良的人,他们向我们充分解释了如何做我们从一开始就学到的东西。请充分解释。

非常感谢,

一步步

4

1 回答 1

4

好吧,这是一个可以解决问题的替代脚本:

@echo off
set INPUT_FILE=results.txt
set OUTPUT_FILE=emails.txt
set "REGEXP=[\.A-Z\-_][\.A-Z\-_]*@[\.A-Z\-_][\.A-Z\-_]*"
>nul copy nul %OUTPUT_FILE%
for /f "tokens=*" %%a in (%INPUT_FILE%) do for %%b in (%%a) do (
    for /f %%z in ('echo %%b ^| findstr /R /I "%REGEXP%"') do (
        echo %%z >> %OUTPUT_FILE%
    )
)

这很简单:外部循环遍历 in 中每一行中以空格分隔的字符串,INPUT_FILE内部循环使用您的正则表达式过滤电子邮件并将它们附加到OUTPUT_FILE.

希望能帮助到你!

编辑:我改进了正则表达式,以便它更准确地捕获电子邮件模式。它仍然不完美,但如果您对更好的表达方式感兴趣,可以查看此站点。

于 2012-09-11T16:51:18.370 回答