![for 循环处于挂起状态,不执行](https://linux22.com/image/141615/for%20%E5%BE%AA%E7%8E%AF%E5%A4%84%E4%BA%8E%E6%8C%82%E8%B5%B7%E7%8A%B6%E6%80%81%EF%BC%8C%E4%B8%8D%E6%89%A7%E8%A1%8C.png)
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
我使用-F
with 是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 打印出匹配的行号