首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道findstr输出

管道findstr输出
EN

Stack Overflow用户
提问于 2010-04-29 12:07:42
回答 4查看 13.1K关注 0票数 1

Windows命令行,我希望搜索所有行的文件,以:

代码语言:javascript
复制
# NNN "<file>.inc"

其中NNN是一个数字,<file>是任何字符串。

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

下面是我想出的表达方式:

代码语言:javascript
复制
>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*.inc" all_pre.txt

要搜索的文件是all_pre.txt

到目前一切尚好。现在,我想将它传送到另一个命令,例如more

代码语言:javascript
复制
>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc" all_pre.txt | more

其结果与前面的命令输出相同,但文件名作为每一行的前缀(all_pre.txt)。

然后又来了:

代码语言:javascript
复制
FINDSTR: cannot open |
FINDSTR: cannot open more

为什么管子不起作用?

all_pre.txt的内容片段

代码语言:javascript
复制
# 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)"

编辑:我也需要转义regex中的点。不是问题,但值得一提的是。

代码语言:javascript
复制
>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" all_pre.txt

编辑后,弗兰克博拉克:

代码语言:javascript
复制
>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc.*" all_pre.txt | more

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-29 12:35:54

在搜索模式中,您缺少了一个尾随的\"

代码语言:javascript
复制
findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc\"" all_pre.txt | more

以上这些对我来说是有效的。

编辑:

代码语言:javascript
复制
findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more

更新后的搜索字符串现在将与示例中的这些行匹配:

代码语言:javascript
复制
# 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“,您可以将搜索放到一个批处理文件中,如下所示:

代码语言:javascript
复制
@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1

把它命名为myfindstr.bat,并这样称呼它:

代码语言:javascript
复制
myfinsdtr all_pre.txt | more

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

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2013-06-03 04:34:59

我无法真正解释原因,但根据我的经验,尽管固定字符串(例如,findstr )的/c:"some string"行为完全符合要求,但正则表达式是另一回事。我经常使用这样的固定字符串搜索函数从CSV文件中提取行:

代码语言:javascript
复制
C:\> findstr /C:"literal string" filename.csv >  output.csv

那里没问题。

但是使用正则表达式(例如/R "^\"some string\"" )似乎迫使findstr输出到控制台,不能通过任何方式重定向。我尝试了>>>1>2>,并且在使用正则表达式时都失败了。我的解决办法是使用findstr作为辅助命令。就我而言,我是这样做的:

代码语言:javascript
复制
C:\> type filename.csv | findstr /R "^\"some string\"" > output.csv

对于我来说,这是可行的,而不是直接从命令行发出问题,其中包含一个非常复杂的正则表达式字符串。在我的例子中,我只需要转义“for it to work.”。其他字符,例如,和.在表达式中作为文字工作得很好,不需要转义。

我证实,windows 2008和Windows 7的行为都是相同的。

编辑:另一个变体显然也有效:

代码语言:javascript
复制
C:\> findstr /R "^\"some string\"" < filename.csv > output.csv

这与使用type相同,但只是使用命令行本身来创建管道。

票数 1
EN

Stack Overflow用户

发布于 2018-03-22 07:56:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2737107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档