Grep multiple files using regex for specifying filenames to search for

Viewed 10033

Let's say I have n files with names like link123.txt, link345.txt, link645.txt, etc.

I'd like to grep a subset of these n files for a keyword. For example:

grep 'searchtext' link123.txt link 345.txt ...

I'd like to do something like

grep 'searchtext' link[123\|345].txt

How can I mention the filenames as regex in this case?

4 Answers

you can use find and grep together like this

find . -regex '.*/link\(123\|345\).txt' -exec grep 'searchtext' {} \;

Thanks for ghoti's comment.

You can use the bash option extglob, which allows extended use of globbing, including | separated pattern lists.

@(123|456)

Matches one of 123 or 456 once.

shopt -s extglob
grep 'searchtext' link@(123|345).txt
shopt -u extglob

I think you're probably asking for find functionality to search for filenames with regex.

As discussed here, you can easely use find . -regex '.*/link\([0-9]\{3\}\).txt' to show all these three files. Now you have only to play with regex.

PS: Don't forget to specify .*/ in the beginning of pattern.

It seems, you don't need regex to determine the files to grep, since you enumerate them all (well, actually you enumerate the minimal unique part without repeating common prefix/suffix).

If regex functionality is not needed and the only aim is to avoid repeating common prefix/suffix, then simple iterating would be an option:

for i in 123 345 645; do grep searchpattern link$i.txt; done

Related