2016-11-24 78 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% 
    
相關問題