Windows 管道findstr';s输出

Windows 管道findstr';s输出,windows,command-line,pipe,findstr,Windows,Command Line,Pipe,Findstr,Windows命令行中,我要在文件中搜索以以下开头的所有行: # NNN "<file>.inc" 要搜索的文件是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

Windows命令行中,我要在文件中搜索以以下开头的所有行:

# NNN "<file>.inc"
要搜索的文件是
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
为什么管道不管用


剪切所有_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

不起作用,尽管(我认为)它应该多次查找与以前相同的字符串,然后查找任何字符。这必须包括
,对吗?

您的搜索模式中缺少一个尾随
\”

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 /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more
要绕过
findstr
中的这个“bug”,您可以将搜索放入如下批处理文件中:

@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1
将其命名为
myfindstr.bat
并这样称呼:

myfinsdtr all_pre.txt | more
现在可以像往常一样使用管道和重定向操作符


希望能有所帮助。

您的搜索模式中缺少一个尾随的
\“

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 /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more
要绕过
findstr
中的这个“bug”,您可以将搜索放入如下批处理文件中:

@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1
将其命名为
myfindstr.bat
并这样称呼:

myfinsdtr all_pre.txt | more
现在可以像往常一样使用管道和重定向操作符


希望这能有所帮助。

我不能真正解释原因,但根据我的经验,尽管固定字符串(例如
/c:“某些字符串”
)的行为完全符合要求,正则表达式是另一种野兽。我经常使用固定字符串搜索函数从CSV文件中提取行:

C:\> findstr /C:"literal string" filename.csv >  output.csv
没有问题

但是使用正则表达式(例如,
/R“^\”一些字符串“
)似乎会强制
查找str
输出到控制台,并且无法通过任何方式重定向。我尝试了
>
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
C:\>findstr/R“^\”一些字符串\'output.csv

这与使用
类型
的原理相同,但只是使用命令行本身来创建管道。

我无法真正解释原因,但根据我的经验,虽然
findstr
使用固定字符串(例如
/c:“某些字符串”
)的行为完全符合要求,但正则表达式是另一种野兽。我经常像这样使用固定字符串搜索功能从CSV文件中提取行:

C:\> findstr /C:"literal string" filename.csv >  output.csv
没有问题

但是使用正则表达式(例如,
/R“^\”某些字符串“
)似乎会将
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
C:\>findstr/R“^\”一些字符串\'output.csv

这与使用
类型
的原理相同,但只是使用命令行本身来创建管道。

如果使用带有偶数双引号的正则表达式,则效果非常好。但是“字符数”是奇数,重定向不起作用。您可以使用第二个引号完成正则表达式(您可以使用range:
[\“\”]
),也可以使用点元字符替换引号字符


它看起来像一个cmd.exe问题,findstr是无罪的。

如果您使用带有偶数双引号的正则表达式,它可以完美地工作。但是你的“字符数是奇数,重定向不起作用。你可以用第二个引号来完成你的正则表达式(你可以使用范围:
[\“\”]
),或者用点元字符替换你的引号字符


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

注意:返回文本可能有点不同,因为我的操作系统不是英文的。
无法打开
是我自己能做的最好翻译,我不知道在真正的英文操作系统上会是什么。注意:返回文本可能有点不同,因为我的操作系统不是英文的。
无法打开
是我自己能做的最好的翻译,我不知道在真正的英语操作系统上会是什么。是吗?这确实会有不同,但我不知道为什么。我不打算在正则表达式中包含结尾双引号。findstr还必须找到
#123”file.inc格式的行(其他信息)“
。还要注意,
findstr
命令不带管道(且不带尾随
\”