管道findstr的输出

时间:2010-04-29 12:07:42

标签: windows command-line pipe findstr

Windows命令行,我想在文件中搜索以:

开头的所有行
# 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)"

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

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

Frank Bollack之后的编辑:

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

不起作用,虽然(我认为)它应该寻找与之前任何字符相同的字符串。那必须包括",对吗?

3 个答案:

答案 0 :(得分: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

您现在可以照常使用管道和重定向运算符。

希望有所帮助。

答案 1 :(得分:1)

我无法解释原因,但根据我的经验,尽管findstr具有固定字符串的行为(例如/c:"some string")完全符合要求,但正则表达式是不同的野兽。我经常使用像这样的固定字符串搜索功能从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的原理相同,只是使用命令行本身来创建管道。

答案 2 :(得分:0)

如果您使用具有偶数双引号的正则表达式,则它可以正常工作。但你的数量是多少?字符是奇数,重定向不起作用。您可以使用第二个引号完成正则表达式(您可以为此目的使用范围:[\"\"]),或者使用点元字符替换引号字符。

看起来像cmd.exe问题,findstr无罪。