代码之家  ›  专栏  ›  技术社区  ›  Gauthier

管道findstr的输出

  •  1
  • Gauthier  · 技术社区  · 14 年前

    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
    

    为什么水管坏了?


    截取所有\u 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
    

    Frank Bollack之后编辑:

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

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

    3 回复  |  直到 6 年前
        1
  •  3
  •   Frank Bollack    14 年前

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

    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
    

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

    希望有帮助。

        2
  •  1
  •   intech_guy    11 年前

    我不能解释为什么,但根据我的经验 findstr 具有固定字符串的行为(例如 /c:"some string" )正是如愿以偿,正则表达式是另一种野兽。我经常使用固定字符串搜索功能,比如从csv文件中提取行:

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

    没有问题。

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

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

    这对我很有用,不需要直接从命令行发出命令,使用非常复杂的正则表达式字符串。在我的情况下,我只需要逃避“为了工作”。其他字符,如和。在表达式中作为文本工作得很好,但没有转义。

    我确认Windows2008和Windows7上的行为是相同的。

    编辑:另一个变种显然也起作用:

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

    它的原理和使用 type ,但只需使用命令行本身创建管道。

        3
  •  0
  •   Michael Yutsis    6 年前

    如果您使用带有偶数双引号的regex,它将完美工作。但是你的“字符数是奇数,重定向不起作用。您可以用第二个引号来完成regex(为此,您可以使用range: [\"\"] )或将引号字符替换为点元字符。

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