Xah Talk Show 2021-11-09 WolframLang tutorial, on writing a grep, live coding
WolframLang code to grep files in a dir:
#!/usr/bin/env wolframscript executable = $ScriptCommandLine[[1]] If[Length[$ScriptCommandLine] != 3, Print["USAGE:"] Print[executable, " PATTERN PATH"] Exit[1] ] pattern = $ScriptCommandLine[[2]] path = $ScriptCommandLine[[3]] addIndices[list_] := MapIndexed[{First[#2], #1}&, list] lines[text_] := StringSplit[text, {"\r\n", "\r", "\n"}] // addIndices matchingLines[text_] := Select[lines[text], StringContainsQ[#[[2]], pattern]&] printLine[{number_, contents_}] := Print[number, "\t", contents] printIfMatch[file_] := With[{contents = ReadString[file]}, If[StringContainsQ[contents, pattern], Print[file] Scan[printLine, matchingLines[contents]] Print[] ] ] FileSystemScan[printIfMatch, path]
Slight improvement:
(* give a dir path, and a string pattern, open every file in the dir. if the file content contains the pattern, print the line that occur, and print a line number in front *) If[ Length[$ScriptCommandLine] != 3, Print["USAGE:"]; Print[$ScriptCommandLine[[1]], " PATTERN PATH"]; Exit[1] ] pattern = $ScriptCommandLine[[2]] path = $ScriptCommandLine[[3]] addIndices = Function[{list}, MapIndexed[ Function[{x,y}, {First[y], x }] , list] ] lines = addIndices[StringSplit[#, {"\r\n", "\r", "\n"}] ]& matchingLines = Function[{text} , Select[ lines[text], StringContainsQ[#[[2]], pattern]& ] ] printLine = Function[{x} , Print[x[[1]], "\t", x[[2]] ]] printIfMatch = Function[{file}, With[{contents = ReadString[file]}, If[StringContainsQ[contents, pattern], Print[file]; Scan[printLine, matchingLines[contents]]; Print[]; ] ] ] FileSystemScan[printIfMatch, path]