pipe道findstr的输出

Windows命令行,我想search一个文件的所有行开始:

# NNN "<file>.inc" 

NNN是一个数字, <file>任何string。

我想使用findstr,因为我不能要求脚本的用户安装ack。

这是我提出的expression:

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

要search的文件是all_pre.txt

到现在为止还挺好。 现在我想把它传给另一个命令,比如说。

 >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 

为什么pipe道不工作?


剪切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)" 

编辑:我需要逃避正则expression式中的点也。 不是问题,但值得一提。

 >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 

不工作,虽然(我认为)它应该寻找相同的string,然后任何字符任何次数。 那必须包括" ,对吗?

您在搜索模式中错过了\"

 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这个“bug”,你可以把你的搜索放到这样的批处理文件中:

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

将其命名为myfindstr.bat并将其命名为:

 myfinsdtr all_pre.txt | more 

您现在可以像往常一样使用管道和重定向操作符。

希望有所帮助。

我无法真正解释为什么,但从我的经验来说,尽管使用固定字符串(例如/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原理是一样的,只是使用命令行本身来创建管道。