regex Findstr -仅返回正则表达式匹配

0wi1tuuw  于 2022-12-19  发布在  其他
关注(0)|答案(3)|浏览(221)

我在一个文本文件(test.txt)中有这个字符串:

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

有人能帮忙吗?

7d7tgy0s

7d7tgy0s1#

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

1.也可以使用子串替换语法:

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%
puruo6ea

puruo6ea2#

  • 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

dzjeubhm

dzjeubhm3#

使用Type(或Cat)和Grep可以做到这一点。
这将允许随机错误数(最多四位数)。
type c:\temp\test.txt | grep -Eo '[0-9]{1,4} errors'
11个错误

  • 如果错误号大于四位数,请将上述内容修改为预期的最大位数。*

对于完全区分大小写的选项
type c:\temp\test.txt | grep -o "11 errors"
11个错误
或将此不区分大小写的选项与Cat
cat c:\temp\test.txt | grep -o -i "11 ERRORS"
11个错误

相关问题