【问题标题】:Piping to findstr's input管道到 findstr 的输入
【发布时间】:2011-03-04 23:25:18
【问题描述】:

我有一个包含宏名称列表的文本文件(每行一个)。我的最终目标是打印宏名称在当前目录的文件中出现的次数。

宏的名称在C:\temp\macros.txt

命令提示符中的type C:\temp\macros.txt 可以打印列表。

现在我想将该输出通过管道传输到findstr 的标准输入。

type C:\temp\macros.txt | findstr *.ss (ss 是我要查找宏名称的文件类型)。

这似乎不起作用,我没有得到任何结果(非常快,它似乎根本没有尝试)。 findstr <the first row of the macro list> *.ss 确实有效。

我也尝试了findstr *.ss < c:\temp\macros.txt,但没有成功。

【问题讨论】:

    标签: batch-file pipe findstr


    【解决方案1】:

    我认为您对 findstr 的工作方式有些困惑。它以文件名(模式)或标准输入的形式获取输入(在其中查找内容,而不是要查找的内容),但是您要查找的内容总是在命令行上给出作为findstr 的参数。

    findstr foo xyz.txt
    

    在文件xyz.txt中找到字符串foo

    type meh.txt | findstr x
    

    在上一个命令的输出中找到字符串x(在这种情况下是文件meh.txt 的内容——这是对type 命令的一个很好的浪费,很类似于cat 的常见误用)。

    由于您关注的是 counts 而不是宏名称出现的实际行,因此我建议采用不同的方法。这假设您的包含宏的文件每行列出一个:

    for /f "delims=" %x in (macros.txt) do @(echo %x: & find /c "%x" *.ss)
    

    for 循环逐行迭代文件的内容。然后它会继续打印您正在搜索的名称并执行find /c,它实际上会计算匹配的行数。

    【讨论】:

    • 我明白了!有没有办法检查可以从管道中获取哪些参数?您的最后一个命令运行良好,尽管find 的输出非常难看。谢谢!
    • 好吧,您可以手动迭代(使用for)所有*.ss 文件并将find /c 扔给它们,解析其输出并自行格式化。好吧,大多数时候,程序接受什么作为管道输入是很明显的,因为该路径通常用于从文件中读取的大量数据。我还没有看到一个程序(PowerShell cmdlet 不计算在内)也接受来自管道的任意参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多