1

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

# NNN "<file>.inc"

whereNNN是一个数字和<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

在弗兰克博拉克之后编辑:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc.*" all_pre.txt | more

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

4

3 回答 3

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

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

希望有帮助。

于 2010-04-29T12:35:54.567 回答
1

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

C:\> findstr /C:"literal string" filename.csv >  output.csv

那里没有问题。

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

C:\> type filename.csv | findstr /R "^\"some string\"" > output.csv

直接从命令行使用非常复杂的正则表达式字符串,这对我有用,没有问题。在我的情况下,我只需要转义 " 就可以了。其他字符,如 , 和 . 在表达式中作为文字可以正常工作而无需转义。

我确认 Windows 2008 和 Windows 7 上的行为是相同的。

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

C:\> findstr /R "^\"some string\"" < filename.csv > output.csv

它与 using 的原理相同type,但只是使用命令行本身来创建管道。

于 2013-06-03T04:34:59.963 回答
0

如果您使用带有偶数双引号的正则表达式,它会完美运行。但是您的 " 字符数是奇数,重定向不起作用。您可以使用第二个引号来完成您的正则表达式(您可以为此目的使用 range: [\"\"]),或者用点元字符替换您的引号字符。

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

于 2018-03-22T07:56:55.863 回答