#!/usr/bin/c++script #include progdesc ("Sample grep utility\n\n\tgrep pattern file ...\n\tgrep pattern\n"); option count ('c',"count","Produce the match count",false,false); option quiet ('q',"quiet","No output, only return 0 if one match found",false,false); bool foundone = false; if (args.size() == 0){ usage(); }else{ string pattern = args[0]; if (args.size() == 1){ // Read from stdin. FILENAME("-") is stdin args.push_back("-"); } // Find the longest argument, for formatting auto files = args|views::drop(1); auto maxsize = ranges::max_element(files,[](auto &t1, auto &t2){return t1.size() < t2.size();})->size(); for (auto &file:files){ FILENAME f(file); unsigned nbmatch = 0; for (auto &l:f.cat()|contain(pattern)){ nbmatch++; foundone = true; if (!quiet.val && !count.val){ if (args.size() > 2){ cout << format ("{:{}}, line {:4}: {}\n",file,maxsize,l.line_number,l.line); }else{ cout << format ("Line {:4}: {}\n",l.line_number,l.line); } } } if (count.val) cout << format ("{:{}} : {}\n",file,maxsize,nbmatch); if (foundone && quiet.val) break; } } return foundone ? 0 : -1;