将管道输入到findstr中

20

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

宏名称在C:\temp\macros.txt中。

在命令提示符中键入type C:\temp\macros.txt可以正确打印列表。

现在我想将该输出导向findstr的标准输入。

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

这似乎不起作用,我没有得到任何结果(非常快速,似乎根本没有尝试)。findstr<宏列表的第一行>*.ss可以正常工作。

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

1个回答

22

我认为你有点混淆了findstr的工作方式。它要查找的内容(不是要查找的内容)可以作为文件名(模式)或来自标准输入,但是你要查找的内容始终作为findstr的参数在命令行上给出。

findstr foo xyz.txt

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

type meh.txt | findstr x

查找前一个命令的输出中的字符串x(在本例中是文件meh.txt的内容——这是对type命令的常见误用,类似于对cat的滥用)。

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

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

for循环逐行迭代您的文件内容,然后打印您要查找的名称并执行find /c,该命令实际上计算匹配行数。


1
我明白了!有没有办法检查哪个参数可以从管道中获取?你上次的命令运行得很好,尽管“find”的输出非常丑陋。谢谢! - Gauthier
你可以手动遍历所有的 *.ss 文件(使用 for),对它们运行 find /c,解析输出并自行格式化。而且,大多数时候,程序接受管道输入的路径通常用于读取大量数据,否则将从文件中读取。我还没有看到过任何一个程序(PowerShell 命令行不算),可以从管道中随意接受参数。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接