2010-04-29 261 views
1

Windows命令行,我要搜索一個文件開頭的所有行:管道FINDSTR輸出

# NNN "<file>.inc" 

其中NNN是一個數字,<file>任何字符串。

我想使用findstr,因爲我不能要求腳本的用戶安裝ack。

這裏是我想出了表達:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*.inc" all_pre.txt 

文件搜索是all_pre.txt

到目前爲止這麼好。現在我想將其轉換爲另一個命令,例如more

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc" all_pre.txt | more 

這樣的結果是因爲前一個命令的輸出相同,但與文件名前綴的每一行(all_pre.txt)。

然後是:

FINDSTR: cannot open | 
FINDSTR: cannot open more 

爲什麼不能管工作?


剪斷的all_pre.txt

# 1 "main.ss" 
# 7 "main.ss" 
# 11 "main.ss" 
# 52 "main.ss" 
# 1 "Build_flags.inc" 
# 7 "Build_flags.inc" 
# 11 "Build_flags.inc"  
# 20 "Build_flags.inc" 
# 45 "Build_flags.inc(function a called from b)" 

編輯內容:我要逃跑的正則表達式也點。不是問題,但值得一提。弗蘭克Bollack後

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" all_pre.txt 

編輯:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc.*" all_pre.txt | more 

不工作,但(我認爲)應該尋找相同的字符串作爲在此之前的任何字符任意次數。那必須包括",對吧?

+0

注:返回文本可能有點不同nt,因爲我的操作系統不是英文的。 「無法打開」是我能做的最好的翻譯,我不確切知道真正的英文操作系統會是什麼。 – Gauthier 2010-04-29 12:09:06

回答

3

您在搜索模式中遺漏了尾隨\"

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc\"" all_pre.txt | more 

上面的作品適合我。

編輯:

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more 

這個更新的搜索字符串現在將匹配您的示例中這些行:

# 1 "Build_flags.inc" 
# 7 "Build_flags.inc" 
# 11 "Build_flags.inc" 
# 20 "Build_flags.inc" 
# 45 "Build_flags.inc(function a called from b)" 

編輯:

爲了規避這個 「錯誤」 findstr,你可以把你的搜索放到這樣的批處理文件中:

@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1 

名稱它像myfindstr.bat並調用它像:

myfinsdtr all_pre.txt | more 

您現在可以使用管道和重定向運營如常。

希望有所幫助。

+0

是我嗎?它確實有所作爲,但我不知道爲什麼。我不打算在正則表達式中包含最後的雙引號。 findstr還必須找到格式爲「#123」file.inc(其他信息)「'的行。 – Gauthier 2010-04-29 14:13:30

+0

還要注意''findstr'命令沒有管道(沒有尾部'\「')確實輸出正確的行。 – Gauthier 2010-04-29 14:17:30

+0

@Gauthier:我找不到任何可以解釋這種怪異的參考,但它會像」findstr「總是接縫預計搜索字符串中的平衡引號。 – 2010-04-29 16:00:35

0

我無法真正解釋爲什麼,但從我的經驗來看,儘管固定字符串(例如/c:"some string")的findstr行爲完全符合要求,但正則表達式是不同的野獸。我經常使用固定字符串搜索功能來提取CSV文件中的行:

C:\> findstr /C:"literal string" filename.csv > output.csv 

沒有問題。

但是使用正則表達式(例如/R "^\"some string\"")似乎強制findstr輸出到控制檯,無法通過任何方式重定向。我試過>,>>,1>,2>,使用正則表達式時都會失敗。 我的解決方法是使用findstr作爲輔助命令。在我來說,我這樣做:

C:\> type filename.csv | findstr /R "^\"some string\"" > output.csv 

這對我來說,直接在命令行工作沒有問題,有一個非常複雜的正則表達式的字符串。在我的情況下,我只能逃避「爲它的工作,其他字符,如,和。在表達式中的文字工作正常,沒有逃脫

我確認在Windows 2008和Windows上的行爲是相同的7.

編輯:另一種變體顯然也適用:

C:\> findstr /R "^\"some string\"" <filename.csv> output.csv 

是相同的原則,採用type,只是使用命令行本身創建管