仅在非源代码的纯文本文件中搜索

Tim*_*Tim 2 grep text

ELF我使用以下命令在当前目录下的纯文本文件中递归搜索字符串:

grep ELF -r .
Run Code Online (Sandbox Code Playgroud)

但它也搜索二进制文件(例如 zip 文件、PDF 文件)以及 HTML 文件和.js.

如何指定它仅在非源代码的纯文本文件中搜索?

Gil*_*il' 5

使用 GNU grep,传递--binary-files=without-match忽略二进制文件。源代码文件是文本文件,因此它们将包含在结果中。

\n\n

如果您想忽略具有某些扩展名的文本文件,您可以使用该--exclude选项,例如

\n\n
grep -r --exclude=\'*.html\' --exclude=\'*.js\' \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您可以只包含显式匹配的文件,例如

\n\n
grep -r --include=\'*.txt\' \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想忽略属于源代码的文本文件,可以使用该file命令来猜测哪些文件是源代码。这使用启发式方法,因此它可以将源代码检测为非源代码,反之亦然。

\n\n
find -type f exec sh -c \'\n  for x do\n    case $(file <"$x") in\n      *source*) :;; # looks like source code\n      *text*) grep -H -e "$0" "$x";; # looks like text\n      # else: looks like binary\n    esac\n  done\n\' "REGEXP" {} +\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
find -type f exec sh -c \'\n  for x do\n    case $(file -i <"$x") in\n      text/plain\\;*) grep -H -e "$0" "$x";; # looks like text\n      # else: looks like source code or binary\n    esac\n  done\n\' "REGEXP" {} +\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,您可以使用ack代替 grep。Ack 集成了基于文件名的文件分类系统。默认情况下,它适合在源代码中搜索,但您可以通过传递选项告诉它搜索不同类型--type使用 ack 搜索所有文件可能会有所帮助。

\n