Eternal Learner
Eternal Learner

Reputation: 3870

Grep multiple files using regex for specifying filenames to search for

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?

Upvotes: 4

Views: 17305

Answers (4)

CS Pei
CS Pei

Reputation: 11047

you can use find and grep together like this

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

Thanks for ghoti's comment.

Upvotes: 5

Frank Neblung
Frank Neblung

Reputation: 3175

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

Upvotes: 0

tonyamjr
tonyamjr

Reputation: 11

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.

Upvotes: 0

Will Barnwell
Will Barnwell

Reputation: 4089

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

Upvotes: 4

Related Questions