【发布时间】:2014-10-09 10:02:04
【问题描述】:
我想在包含recursive directories 和files 的directory 中搜索多个patterns。
我知道grep的命令如下
grep -e '(pattern1)|(pattern2)'
或
grep -r -E 'string1|string2|string3' /var/www/http
使用ack 或ag 的命令是什么?
【问题讨论】:
我想在包含recursive directories 和files 的directory 中搜索多个patterns。
我知道grep的命令如下
grep -e '(pattern1)|(pattern2)'
或
grep -r -E 'string1|string2|string3' /var/www/http
使用ack 或ag 的命令是什么?
【问题讨论】:
这就够了:
ack -R 'string1|string2'
因为-R是默认的,所以可以省略:
ack 'string1|string2'
来自man ack:
-r、-R、--recurse
递归到子目录。这是默认设置,仅用于 与 grep 的兼容性。你也可以用它来转动 --no-recurse 关闭。
如果您想从文件中获取模式,例如 /path/to/patterns.file,您可以使用:
ack "$(cat /path/to/patterns.file)"
或等效:
ack "$(< /path/to/patterns.file)"
我找不到与 grep -f 完全相同的内容。
【讨论】:
grep 中提供等效项,以准确了解您所指的功能。
grep -f pattern.txt之类的文件中读取模式,如果我将它们保存在文件中,是否有必要以^等特殊字符开始模式
ack "$(< /path/to/patterns.file)" * 获取它。查看更新。
ack "$(cat /path/to/patterns.file)" * 工作正常,通过将文件 | 中的模式保持分隔,如 pat1|pat2
output 也保存在我目前正在使用ack "$(< /path/to/patterns.file)" * > output.txt 的文件中,但问题是读取/编辑output 文件很困难。
ack 命令也可以与管道一起使用。 例如,第一个 ack 找到包含 pattern1 的文件,然后将其传送到另一个 ack 以仅在这些文件中搜索 pattern2
ack -l 'pattern1' | ack -x 'pattern2'
-l 参数意味着只列出匹配的文件(而不是匹配的文本)。 -x 参数意味着只搜索通过管道传输给它的文件。这类似于为下一次 ack 搜索缩小文件范围。
ack -l 'pattern1' | ack -xl 'pattern2' | ack -x 'pattern3'
这是一个 AND 运算符,而不是其他解决方案中给出的 OR 运算符。
【讨论】:
对于ag,从版本 0.19.2 开始,默认是递归搜索目录和文件。
要搜索多个模式,可以使用类似ack的语法
ag 'pattern1|pattern2'
将同时搜索pattern1 和pattern2。
如果不想递归搜索,可以通过开关--depth NUM将搜索深度设置为1
因此,
ag 'pattern1|pattern2' --depth 1
只会在当前目录中搜索这两种模式。
【讨论】:
我不知道为什么,但对于我的用例,管道解决方案不起作用。
我只是将ack -l 的输出用作grep 的输入。例如快速查找所有包含string 1和string 2的Javascript文件:
grep "string 2" `ack -l --js "string 1"`
【讨论】: