for 循环处于挂起状态,不执行

for 循环处于挂起状态,不执行

heaq我试图在 *.md 文件中找到包含 word 的所有行

$  for i in $(find . -regex ".*md$"); do grep -i "heaq"; done
#pending
#pending

然而,它一直悬而未决。

我的代码有什么问题?

答案1

这是grep“待定”的。当grep运行时没有要读取的文件名时,它将读取标准输入。如果您没有在标准输入上提供任何数据,它将显示为“挂起”。

您还循环遍历 的输出find。这是不优雅的(循环不会运行,直到找到所有路径名find)并且危险(路径名将在空格上分割,并且 shell 将对它们执行文件名通配)。

相反,如果您想grep在具有特定文件名后缀的所有文件上运行:

find . -type f -name '*.md' -exec grep -iF 'heaq' {} +

我已将-regex其更改为标准-name测试,其模式仅匹配带有.md文件名后缀的文件名。我还添加了它,-type f因为它只在常规文件上运行才有意义grep(您可能希望更改-type f! -type d在任何非目录上运行它)。

对找到的路径名批量grep执行。-exec我使用-Fwith 是grep因为我们匹配的是字符串,而不是正则表达式。-w如果您想匹配一个单词而不是任何子字符串,您可能需要添加。

有关的:

答案2

你需要将文件名传递给grep

很喜欢

$ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done

你也可以使用

% grep -i -n "heaq" $(find . -regex ".*md$")

-n使 grep 打印出匹配的行号

相关内容