我有这个字符串在一个文本文件(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
有人能帮助?
我有这个字符串在一个文本文件(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
有人能帮助?
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如何使用上面的脚本。
有没有其他的cmd工具可以做到这一点?我不想使用PowerShell进行此任务 – ohadinho
在Windows上?那么,没有太多的选项支持真正的正则表达式。 Powershell是一款内置软件,为什么不使用它?如果你坚持,那么VBScript解决方案呢? –
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 enough
或35 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
有几种选择:
一个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
子可以使用字符串替换语法:
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%
您正在使用错误的功能。阅读有关findstr及其功能。 – malutki5200