Search Directories and Files With a Grep Utility
Learn to search directories and files with a grep utility.
We'll cover the following...
To demonstrate traversing and searching directory structures, we create a simple utility that works like Unix grep. This utility uses recursive_directory_iterator
to traverse nested directories and searches files for matches with a regular expression.
How to do it
In this recipe, we write a simple grep that traverses directories to search files with a regular expression:
We start with some convenience aliases where
match_v
is avector
of regular expression match results:
namespace fs = std::filesystem;using de = fs::directory_entry;using rdit = fs::recursive_directory_iterator;using match_v = vector<std::pair<size_t, std::string>>;
We continue using our
formatter
specialization forpath
objects:
template<>struct std::formatter<fs::path>: std::formatter<std::string> {template<typename FormatContext>auto format(const fs::path& p, FormatContext& ctx) {return format_to(ctx.out(), "{}", p.string());}};
We have a simple function for getting regular expression matches from a file:
match_v matches(const fs::path& fpath, const regex& re) {match_v matches{};std::ifstream instrm(fpath.string(), std::ios_base::in);string s;for(size_t lineno{1}; getline(instrm, s); ++lineno) {if(std::regex_search(s.begin(), s.end(), re)) {matches.emplace_back(lineno, move(s));}}return matches;}
In this function, we open the file with ifstream
, read lines from the file with getline()
, and match the regular expression with regex_search()
. Results are collected in the vector
...