2016-11-24 80 views
3

我有这个字符串在一个文本文件(test.txt):Findstr工具 - 仅仅返回一个正则表达式匹配

BLA BLA BLA 
BLA BLA 
Found 11 errors and 7 warnings 

我执行此命令:

findstr /r "[0-9]+ errors" test.txt 

为了得到公正11 errors字符串。

相反,输出是:

Found 11 errors and 7 warnings 

有人能帮助?

+0

您正在使用错误的功能。阅读有关findstr及其功能。 – malutki5200

回答

1

findstr工具不能用于仅提取匹配。为此使用Powershell更容易。

下面是一个例子:

$input_path = 'c:\ps\in.txt' 
$output_file = 'c:\ps\out.txt' 
$regex = '[0-9]+ errors' 
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file 

the Windows PowerShell: Extracting Strings Using Regular Expressions article如何使用上面的脚本。

+0

有没有其他的cmd工具可以做到这一点?我不想使用PowerShell进行此任务 – ohadinho

+0

在Windows上?那么,没有太多的选项支持真正的正则表达式。 Powershell是一款内置软件,为什么不使用它?如果你坚持,那么VBScript解决方案呢? –

3

findstr总是返回每个包含匹配的完整行,它不能仅返回子字符串。因此,您需要自行完成子字符串提取。反正有你findstr命令行中的一些问题,我想指出:

findstr实际上定义了由白空格分隔的多个搜索字符串,字符串参数,这样一个搜索字符串是[0-9]+,另一种是error。您的文本文件中的行Found 11 errors and 7 warnings由于仅字error而返回,数字部分不是匹配的一部分,因为findstr不支持+字符(一个或多个以前的字符或类),您需要更改那部分搜索字符串要达到[0-9][0-9]*。要将整个字符串视为一个搜索字符串,您需要提供/C选项;由于默认为文字搜索模式,因此您还需要明确添加/R选项。

findstr /R /C:"[0-9][0-9]* errors" "test.txt" 

改变所有这些也会匹配字符串,如x5 errorse;以避免您可以使用字词边界,如\<(字的开头)和\>(字的结尾)。 (或者,您也可以在搜索字符串的任一侧包含空格,因此/C:" [0-9][0-9]* errors ",但如果搜索字符串出现在适用行的开头或结尾,可能会造成麻烦。)

所以关于所有上述的,校正后的和改进的命令行看起来像这样:

findstr /R /C:"\<[0-9][0-9]* errors\>" "test.txt" 

这将返回含有匹配整行:

Found 11 errors and 7 warnings 

如果你只想返回这样的行,并排除2 errors are enough35 warnings but less than 3 errors这样的行,你当然可以扩展搜索字符串:

findstr /R /C:"^Found [0-9][0-9]* errors and [0-9][0-9]* warnings$" "test.txt" 

无论如何,以提取部11 errors有几种选择:

  1. 一个for /F环可以解析的findstr输出和提取某些令牌:

    for /F "tokens=2-3 delims= " %%E in (' 
        findstr/R /C:"\<[0-9][0-9]* errors\>" "test.txt" 
    ') do echo(%%E %%F 
    
  2. 子可以使用字符串替换语法:

    for /F "delims=" %%L in (' 
        findstr /R /C:"\<[0-9][0-9]* errors\>" "test.txt" 
    ') do set "LINE=%%L" 
    set "LINE=%LINE:* =%" 
    set "LINE=%LINE: and =" & rem "%" 
    echo(%LINE% 
    
相关问题