我有這個字符串在一個文本文件(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