Searching multiple patterns (words) with ack?

删除回忆录丶 提交于 2019-11-30 13:28:19

This should be enough:

ack -R 'string1|string2'

As -R is the default, you can omit it:

ack 'string1|string2'

From man ack:

-r, -R, --recurse

Recurse into sub-directories. This is the default and just here for compatibility with grep. You can also use it for turning --no-recurse off.


If you want to get the pattern from a file, say /path/to/patterns.file, you can use:

ack "$(cat /path/to/patterns.file)"

or equivallently:

ack "$(< /path/to/patterns.file)"

I cannot find an exact equivalent to grep -f.

For ag, as of verion 0.19.2 the default is to search in directories and files recursively.

To search for multiple patterns, you can use similiar syntax as ack

ag 'pattern1|pattern2'

will search for both pattern1 and pattern2.

In case you don't want to search recursively, you can set the search depth to 1 by the switch --depth NUM

Therefore,

ag 'pattern1|pattern2' --depth 1

will only search in the current directory for both patterns.

I don't know why but for my use case, the pipe solution didn't work.

I simply used the output of ack -l as the input to grep. For example, to quickly find all Javascript files containing string 1 and string 2:

grep "string 2" `ack -l --js "string 1"`

The ack command can also string along with pipes. For example the first ack finds files containing pattern1 then pipe that to another ack to search just those files for pattern2

ack -l 'pattern1' | ack -x 'pattern2'

The -l parameter means to just list the matching files (instead of the matching text). The -x parameter means to search just the files piped to it. This is similar to narrowing down the files for the next ack search.

ack -l 'pattern1' | ack -xl 'pattern2' | ack -x 'pattern3'

This is an AND operator and not the OR operator given in the other solutions.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!