Description
grep-like CLI using Parsec parsers instead of regex.
Description
pgrep is a grep-like command-line tool that uses Parsec parser combinators instead of regular expressions for pattern matching. Write patterns using a familiar Haskell-like DSL with combinators like 'some digit', 'string TODO', or 'manyTill anyChar (string END)'.
README.md
scrappy-file
File system utilities for the scrappy web scraping library, plus pgrep - a grep-like CLI that uses Parsec parsers instead of regex.
pgrep
Search files using Parsec parser patterns instead of regular expressions.
Installation
cabal build pgrep
cabal install pgrep
Make sure ~/.local/bin is in your PATH:
export PATH="$HOME/.local/bin:$PATH"
Usage
pgrep PATTERN FILE...
pgrep [OPTIONS] PATTERN FILE...
DSL Primitives
| Primitive | Example | Description |
|---|---|---|
char | char 'x' | Single character |
string | string "abc" | Literal string |
anyChar | anyChar | Any character |
digit | digit | 0-9 |
letter | letter | a-z, A-Z |
alphaNum | alphaNum | Letter or digit |
space | space | Single whitespace |
spaces | spaces | Zero or more whitespace |
newline | newline | Newline character |
oneOf | oneOf "abc" | Match one of chars |
noneOf | noneOf "xyz" | Match none of chars |
DSL Combinators
| Combinator | Syntax | Description |
|---|---|---|
| Sequence | p1 >> p2 | Run p1 then p2, return p2's result |
| Concat | p1 <+> p2 | Run both, concatenate results |
| Alternative | p1 <|> p2 | Try p1, else p2 |
| Many | many p | Zero or more |
| Some | some p | One or more |
| Optional | optional p | Zero or one |
| Try | try p | Backtracking |
| Between | between '(' ')' p | Parse between delimiters |
| Count | count 3 p | Exactly n repetitions |
| ManyTill | manyTill p end | Non-greedy: match p until end |
Examples
# Find digits
pgrep 'some digit' file.txt
# Find email patterns
pgrep 'some alphaNum <+> char '\''@'\'' <+> some alphaNum <+> char '\''.'\'' <+> some letter' contacts.txt
# Find TODO comments
pgrep 'string "TODO"' -r ./src/
# Search recursively with extension filter
pgrep -r -e .hs 'string "import"' ./src/
# Count matches
pgrep -c 'digit' data.txt
# JSON output
pgrep --json 'some digit' file.txt
# Non-greedy matching: find everything between X and Y
pgrep 'string "START" <+> manyTill anyChar (string "END")' file.txt
Options
-r, --recursive Search directories recursively
-e, --extension EXT Only search files with extension (e.g., .hs, .txt)
-v, --verbose Verbose output with full match text
-c, --count Only print count of matches
-q, --quiet Quiet mode (exit code only)
-m, --max-results N Maximum number of results to show
--json Output results as JSON
Output Format
Default output is grep-like:
file.txt:1:28:123
file.txt:2:5:[email protected]
Format: filepath:line:column:matched_text
Library API
The Scrappy.Grep.* modules expose:
Scrappy.Grep.DSL- AST types (ParserExpr,MatchResult)Scrappy.Grep.DSL.Parser- Parse DSL strings to ASTScrappy.Grep.DSL.Interpreter- Convert AST to Parsec parsersScrappy.Grep.Search- File/directory search functionsScrappy.Grep.Output- Result formatting.