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
不起作用,虽然(我认为)它应该寻找与之前任何字符相同的字符串。那必须包括"
,对吗?
答案 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无罪。