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)"编辑:我也需要转义regex中的点。不是问题,但值得一提的是。
>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不工作,虽然(我认为)它应该寻找相同的字符串与以前的任何字符任何次数。这必须包括",对吗?
发布于 2010-04-29 12:35:54
在搜索模式中,您缺少了一个尾随的\"。
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您现在可以像往常一样使用管道和重定向操作符。
希望这能有所帮助。
发布于 2013-06-03 04:34:59
我无法真正解释原因,但根据我的经验,尽管固定字符串(例如,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对于我来说,这是可行的,而不是直接从命令行发出问题,其中包含一个非常复杂的正则表达式字符串。在我的例子中,我只需要转义“for it to work.”。其他字符,例如,和.在表达式中作为文字工作得很好,不需要转义。
我证实,windows 2008和Windows 7的行为都是相同的。
编辑:另一个变体显然也有效:
C:\> findstr /R "^\"some string\"" < filename.csv > output.csv这与使用type相同,但只是使用命令行本身来创建管道。
发布于 2018-03-22 07:56:55
如果你使用偶数双引号的正则表达式,它会很好地工作。但是你的“字符是奇怪的,重定向不起作用。你可以用第二个引号来完成你的正则表达式(你可以使用范围:[\"\"]),或者用点元字符替换你的引号字符。”
这看起来像是cmd.exe问题,findstr是无罪的。
https://stackoverflow.com/questions/2737107
复制相似问题