首页 > 解决方案 > 查找包含匹配 2 个不同模式的行的文件

问题描述

我正在尝试搜索我的代码库以查找缩进不一致的文件。基本上,我不在乎文件是否使用制表符或空格缩进,只要它在内部是一致的。

显然,我可以运行grep -Prn "^\t" src以查找以制表符开头的行和grep -Prn "^ " src空格,但我不知道如何搜索包含至少 1 个匹配这两种模式的文件。

我能想出的最好的东西

for f in `grep -Prl "^\t" src` ; do grep -Pl "^ " $f; done

但这对于大型代码库来说非常慢。有没有更快的方法可以用一个 grep 命令来做到这一点?

标签: bashgrep

解决方案


您是否尝试在 src 目录下查找缩进中同时包含制表符和空格的文件的名称(可能在单独的行上)?在任何 UNIX 机器上的任何 shell 中使用任何 find 和任何 awk 就是这样:

find src -type f -exec awk '/^[[:space:]]*\t/{t=1} /^[[:space:]]* /{b=1} b&&t{print FILENAME; exit}' {} \;

否则使用 GNU find 和 GNU awk 会更有效(因为 awk 将被批量调用而不是一次调用 1 个文件):

find src -type f -exec awk '/^[[:space:]]*\t/{t=1} /^[[:space:]]* /{b=1} b&&t{print FILENAME; b=t=0; nextfile}' {} +

推荐阅读