Windows命令行,我想search一个文件的所有行开始:
# NNN "<file>.inc"
NNN
是一个数字, <file>
任何string。
我想使用findstr,因为我不能要求脚本的用户安装ack。
这是我提出的expression:
>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*.inc" all_pre.txt
要search的文件是all_pre.txt
。
到现在为止还挺好。 现在我想把它传给另一个命令,比如说。
>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
为什么pipe道不工作?
剪切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)"
编辑:我需要逃避正则expression式中的点也。 不是问题,但值得一提。
>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
不工作,虽然(我认为)它应该寻找相同的string,然后任何字符任何次数。 那必须包括"
,对吗?
您在搜索模式中错过了\"
。
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
您现在可以像往常一样使用管道和重定向操作符。
希望有所帮助。
我无法真正解释为什么,但从我的经验来说,尽管使用固定字符串(例如/c:"some string"
)的findstr
行为完全符合要求,但正则表达式是不同的野兽。 我经常使用固定字符串搜索功能来从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
原理是一样的,只是使用命令行本身来创建管道。