Reputation: 3870
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
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
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
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
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