如何在模式文件上调用 grep?

How to call grep on pattern files?

我正在尝试对名称与正则表达式匹配的文件进行 grep。但以下:

#!/bin/bash
grep -o -e "[a-zA-Z]\{1,\}"   -h --include= -R

仅在某些情况下有效。当我这样调用这个脚本时:

./script.sh dir1/ [A-La-l]+

没用。但以下:

./script.sh dir1/ \*.txt

工作正常。我也尝试过在双引号和引号中传递参数,但都不适合我。 您有解决这个问题的想法吗?

grep--include 选项不接受正则表达式,而是接受 glob(例如 *.txt),它的功能要弱得多。您必须决定是要匹配正则表达式还是 glob——*.txt 不是有效的正则表达式(等效的正则表达式是 .*\.txt),而 [A-La-l]+ 不是有效的 glob。

如果你想用正则表达式来完成,你将无法单独使用 grep 来完成。您可以做的一件事是将文件选择留给其他工具,例如 find:

find "" -type f -regex "" -exec grep -o -e '[a-zA-Z]\{1,\}' -h '{}' +

这将构造 运行 一个命令 grep -o -e '[a-zA-Z]\{1,\}' -h list of files in matching the regex 。如果您将 + 替换为 \;,它将 运行 单独针对每个文件的命令,这应该会(非常)稍微慢一点地产生相同的结果。

如果你想用globs来做,你可以像以前一样进行;您的代码已经这样做了。不过,您应该在 </code> 和 <code> 两边加上双引号。