2021-07-17 14:19:55 -07:00
|
|
|
.\" Automatically generated by Pandoc 2.14.0.2
|
2021-05-19 22:02:45 -07:00
|
|
|
.\"
|
|
|
|
.TH "BP" "1" "May 17 2021" "" ""
|
|
|
|
.hy
|
2020-09-11 01:54:26 -07:00
|
|
|
.SH NAME
|
2021-05-19 22:02:45 -07:00
|
|
|
.PP
|
|
|
|
bp - Bruce\[aq]s Parsing Expression Grammar tool
|
2020-09-11 01:54:26 -07:00
|
|
|
.SH SYNOPSIS
|
2021-05-19 22:02:45 -07:00
|
|
|
.PP
|
2021-05-23 15:21:46 -07:00
|
|
|
\f[B]bp\f[R] [\f[I]options\&...\f[R]] \f[I]pattern\f[R] [[\f[B]--\f[R]]
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[I]files\&...\f[R]]
|
2020-09-11 01:54:26 -07:00
|
|
|
.SH DESCRIPTION
|
2021-05-19 22:02:45 -07:00
|
|
|
.PP
|
|
|
|
\f[B]bp\f[R] is a tool that matches parsing expression grammars using a
|
|
|
|
custom syntax.
|
2020-09-11 01:54:26 -07:00
|
|
|
.SH OPTIONS
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
2021-07-30 20:46:50 -07:00
|
|
|
\f[B]-p\f[R], \f[B]--pattern\f[R] \f[I]pat\f[R]
|
|
|
|
Give a pattern in BP syntax instead of string syntax (equivalent to
|
|
|
|
\f[B]bp \[aq]\[rs](pat)\[aq]\f[R]
|
|
|
|
.TP
|
|
|
|
\f[B]-w\f[R], \f[B]--word\f[R] \f[I]word\f[R]
|
|
|
|
Surround a string pattern with word boundaries (equivalent to
|
|
|
|
\f[B]bp \[aq]\[rs]|word\[rs]|\[aq]\f[R])
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]-e\f[R], \f[B]--explain\f[R]
|
2020-12-14 22:32:47 -08:00
|
|
|
Print a visual explanation of the matches.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]-j\f[R], \f[B]--json\f[R]
|
|
|
|
Print a JSON list of the matches.
|
|
|
|
(Pairs with \f[B]--verbose\f[R] for more detail)
|
|
|
|
.TP
|
|
|
|
\f[B]-l\f[R], \f[B]--list-files\f[R]
|
|
|
|
Print only the names of files containing matches instead of the matches
|
|
|
|
themselves.
|
|
|
|
.TP
|
|
|
|
\f[B]-i\f[R], \f[B]--ignore-case\f[R]
|
2020-09-14 12:16:15 -07:00
|
|
|
Perform pattern matching case-insensitively.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]-I\f[R], \f[B]--inplace\f[R]
|
|
|
|
Perform filtering or replacement in-place (i.e.\ overwrite files with
|
|
|
|
new content).
|
|
|
|
.TP
|
|
|
|
\f[B]-r\f[R], \f[B]--replace\f[R] \f[I]replacement\f[R]
|
2020-09-11 01:54:26 -07:00
|
|
|
Replace all occurrences of the main pattern with the given string.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]-s\f[R], \f[B]--skip\f[R] \f[I]pattern\f[R]
|
|
|
|
While looking for matches, skip over \f[I]pattern\f[R] occurrences.
|
|
|
|
This can be useful for behavior like \f[B]bp -s string\f[R] (avoiding
|
|
|
|
matches inside string literals).
|
|
|
|
.TP
|
|
|
|
\f[B]-g\f[R], \f[B]--grammar\f[R] \f[I]grammar-file\f[R]
|
2020-09-11 01:54:26 -07:00
|
|
|
Load the grammar from the given file.
|
2021-05-19 22:02:45 -07:00
|
|
|
See the \f[B]GRAMMAR FILES\f[R] section for more info.
|
|
|
|
.TP
|
|
|
|
\f[B]-G\f[R], \f[B]--git\f[R]
|
|
|
|
Use \f[B]git\f[R] to get a list of files.
|
|
|
|
Remaining file arguments (if any) are passed to \f[B]git --ls-files\f[R]
|
|
|
|
instead of treated as literal files.
|
|
|
|
.TP
|
2021-08-02 12:25:52 -07:00
|
|
|
\f[B]-B\f[R], \f[B]--context-before\f[R] \f[I]N\f[R]
|
|
|
|
The number of lines of context to print before each match (default: 0).
|
|
|
|
See \f[B]--context\f[R] below for details on \f[B]none\f[R] or
|
|
|
|
\f[B]all\f[R].
|
|
|
|
.TP
|
|
|
|
\f[B]-A\f[R], \f[B]--context-after\f[R] \f[I]N\f[R]
|
|
|
|
The number of lines of context to print after each match (default: 0).
|
|
|
|
See \f[B]--context\f[R] below for details on \f[B]none\f[R] or
|
|
|
|
\f[B]all\f[R].
|
|
|
|
.TP
|
2021-08-02 11:45:01 -07:00
|
|
|
\f[B]-C\f[R], \f[B]--context\f[R] \f[I]N\f[R]
|
2021-08-02 12:25:52 -07:00
|
|
|
The number of lines to print before and after each match (default: 0).
|
|
|
|
If \f[I]N\f[R] is \f[B]none\f[R], print only the exact text of the
|
|
|
|
matches.
|
|
|
|
If \f[I]N\f[R] is \f[B]\[lq]all\[rq]\f[R], print all text before and
|
|
|
|
after each match.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]-f\f[R], \f[B]--format\f[R] \f[I]auto\f[R]|\f[I]fancy\f[R]|\f[I]plain\f[R]
|
|
|
|
Set the output format.
|
|
|
|
\f[I]fancy\f[R] includes colors and line numbers, \f[I]plain\f[R]
|
|
|
|
includes neither, and \f[I]auto\f[R] (the default) uses \f[I]fancy\f[R]
|
2021-05-12 20:33:27 -07:00
|
|
|
formatting only when the output is a TTY.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
2021-07-30 20:46:50 -07:00
|
|
|
\f[B]-h\f[R], \f[B]--help\f[R]
|
2020-09-11 01:54:26 -07:00
|
|
|
Print the usage and exit.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[I]pattern\f[R]
|
|
|
|
The main pattern for bp to match.
|
|
|
|
By default, this pattern is a string pattern (see the \f[B]STRING
|
|
|
|
PATTERNS\f[R] section below).
|
|
|
|
.TP
|
|
|
|
\f[I]files\&...\f[R]
|
|
|
|
The input files to search.
|
|
|
|
If no input files are provided and data was piped in, that data will be
|
|
|
|
used instead.
|
|
|
|
If neither are provided, \f[B]bp\f[R] will search through all files in
|
|
|
|
the current directory and its subdirectories (recursively).
|
|
|
|
.SH STRING PATTERNS
|
|
|
|
.PP
|
|
|
|
One of the most common use cases for pattern matching tools is matching
|
|
|
|
plain, literal strings, or strings that are primarily plain strings,
|
|
|
|
with one or two patterns.
|
|
|
|
\f[B]bp\f[R] is designed around this fact.
|
|
|
|
The default mode for bp patterns is \[lq]string pattern mode\[rq].
|
|
|
|
In string pattern mode, all characters are interpreted literally except
|
2021-07-19 19:57:59 -07:00
|
|
|
for the backslash (\f[B]\[rs]\f[R]), which may be followed by an escape
|
|
|
|
or a bp pattern (see the \f[B]PATTERNS\f[R] section below).
|
2021-05-19 22:02:45 -07:00
|
|
|
Optionally, the bp pattern may be terminated by a semicolon
|
|
|
|
(\f[B];\f[R]).
|
2020-09-13 23:31:38 -07:00
|
|
|
.SH PATTERNS
|
2021-05-19 22:02:45 -07:00
|
|
|
.PP
|
|
|
|
\f[B]bp\f[R] patterns are based off of a combination of Parsing
|
|
|
|
Expression Grammars and regular expression syntax.
|
|
|
|
The syntax is designed to map closely to verbal descriptions of the
|
|
|
|
patterns, and prefix operators are preferred over suffix operators (as
|
|
|
|
is common in regex syntax).
|
2021-05-23 15:21:46 -07:00
|
|
|
Patterns are whitespace-agnostic, so they work the same regardless of
|
|
|
|
whether whitespace is present or not, except for string literals
|
|
|
|
(\f[B]\[aq]...\[aq]\f[R] and \f[B]\[dq]...\[dq]\f[R]), character
|
|
|
|
literals (\f[B]\[ga]\f[R]), and escape sequences (\f[B]\[rs]\f[R]).
|
|
|
|
Whitespace between patterns or parts of a pattern should be used for
|
|
|
|
clarity, but it will not affect the meaning of the pattern.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[I]pat1 pat2\f[R]
|
|
|
|
A sequence: \f[I]pat1\f[R] followed by \f[I]pat2\f[R]
|
|
|
|
.TP
|
|
|
|
\f[I]pat1\f[R] \f[B]/\f[R] \f[I]pat2\f[R]
|
|
|
|
A choice: \f[I]pat1\f[R], or if it doesn\[aq]t match, then
|
|
|
|
\f[I]pat2\f[R]
|
|
|
|
.TP
|
|
|
|
\f[B].\f[R]
|
2021-05-10 21:30:31 -07:00
|
|
|
Any character (excluding newline)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]\[ha]\f[R]
|
2021-05-10 21:30:31 -07:00
|
|
|
Start of a line
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]\[ha]\[ha]\f[R]
|
2021-05-10 21:30:31 -07:00
|
|
|
Start of the text
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]$\f[R]
|
2021-05-10 21:30:31 -07:00
|
|
|
End of a line (does not include newline character)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]$$\f[R]
|
2021-05-10 21:30:31 -07:00
|
|
|
End of the text
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]_\f[R]
|
|
|
|
Zero or more whitespace characters, including spaces and tabs, but not
|
|
|
|
newlines.
|
|
|
|
.TP
|
|
|
|
\f[B]__\f[R]
|
|
|
|
Zero or more whitespace characters, including spaces, tabs, newlines,
|
|
|
|
and comments.
|
|
|
|
Comments are undefined by default, but may be defined by a separate
|
|
|
|
grammar file.
|
|
|
|
See the \f[B]GRAMMAR FILES\f[R] section for more info.
|
|
|
|
.TP
|
|
|
|
\f[B]\[dq]foo\[dq]\f[R], \f[B]\[aq]foo\[aq]\f[R]
|
|
|
|
The literal string \f[B]\[lq]foo\[rq]\f[R].
|
|
|
|
Single and double quotes are treated the same.
|
|
|
|
Escape sequences are not allowed.
|
|
|
|
.TP
|
|
|
|
\f[B]\[ga]\f[R]\f[I]c\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
The literal character \f[I]c\f[R] (e.g.\ \f[B]\[ga]\[at]\f[R] matches
|
|
|
|
the \[lq]\[at]\[rq] character)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]\[ga]\f[R]\f[I]c1\f[R]\f[B]-\f[R]\f[I]c2\f[R]
|
|
|
|
The character range \f[I]c1\f[R] to \f[I]c2\f[R]
|
|
|
|
(e.g.\ \f[B]\[ga]a-z\f[R]).
|
|
|
|
Multiple ranges can be combined with a comma
|
|
|
|
(e.g.\ \f[B]\[ga]a-z,A-Z\f[R]).
|
|
|
|
.TP
|
2021-07-17 14:19:55 -07:00
|
|
|
\f[B]\[ga]\f[R]\f[I]c1\f[R]\f[B],\f[R]\f[I]c2\f[R]
|
|
|
|
Any one of the given character or character ranges \f[I]c1\f[R] or
|
|
|
|
\f[I]c2\f[R] (e.g.\ \f[B]\[ga]a,e,i,o,u,0-9\f[R])
|
|
|
|
.TP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]\[rs]\f[R]\f[I]esc\f[R]
|
|
|
|
An escape sequence (e.g.\ \f[B]\[rs]n\f[R], \f[B]\[rs]x1F\f[R],
|
|
|
|
\f[B]\[rs]033\f[R], etc.)
|
|
|
|
.TP
|
|
|
|
\f[B]\[rs]\f[R]\f[I]esc1\f[R]\f[B]-\f[R]\f[I]esc2\f[R]
|
|
|
|
An escape sequence range from \f[I]esc1\f[R] to \f[I]esc2\f[R]
|
|
|
|
(e.g.\ \f[B]\[rs]x00-x1F\f[R])
|
|
|
|
.TP
|
2021-07-17 14:19:55 -07:00
|
|
|
\f[B]\[rs]\f[R]\f[I]esc1\f[R]\f[B],\f[R]\f[I]esc2\f[R]
|
|
|
|
Any one of the given escape sequences or ranges \f[I]esc1\f[R] or
|
|
|
|
\f[I]esc2\f[R] (e.g.\ \f[B]\[rs]r,n,x01-x04\f[R])
|
|
|
|
.TP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]\[rs]N\f[R]
|
|
|
|
A special case escape that matches a \[lq]nodent\[rq]: one or more
|
|
|
|
newlines followed by the same indentation that occurs on the current
|
|
|
|
line.
|
|
|
|
.TP
|
2021-07-19 19:40:43 -07:00
|
|
|
\f[B]\[rs]i\f[R]
|
|
|
|
An identifier character (e.g.\ alphanumeric characters or underscores).
|
|
|
|
.TP
|
|
|
|
\f[B]\[rs]I\f[R]
|
|
|
|
An identifier character, not including numbers (e.g.\ alphabetic
|
|
|
|
characters or underscores).
|
|
|
|
.TP
|
2021-07-30 20:23:18 -07:00
|
|
|
\f[B]|\f[R]
|
|
|
|
A word boundary (i.e.\ the edge of a word).
|
|
|
|
.TP
|
2021-07-19 19:40:43 -07:00
|
|
|
\f[B]\[rs]b\f[R]
|
2021-07-30 20:23:18 -07:00
|
|
|
Alias for \f[B]|\f[R] (word boundary)
|
2021-07-19 19:40:43 -07:00
|
|
|
.TP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]!\f[R] \f[I]pat\f[R]
|
|
|
|
Not \f[I]pat\f[R]
|
|
|
|
.TP
|
|
|
|
\f[B][\f[R] \f[I]pat\f[R] \f[B]]\f[R]
|
|
|
|
Maybe \f[I]pat\f[R]
|
|
|
|
.TP
|
|
|
|
\f[I]N\f[R] \f[I]pat\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
Exactly \f[I]N\f[R] repetitions of \f[I]pat\f[R]
|
|
|
|
(e.g.\ \f[B]5 \[dq]x\[dq]\f[R] matches \f[B]\[lq]xxxxx\[rq]\f[R])
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[I]N\f[R] \f[B]-\f[R] \f[I]M\f[R] \f[I]pat\f[R]
|
|
|
|
Between \f[I]N\f[R] and \f[I]M\f[R] repetitions of \f[I]pat\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
(e.g.\ \f[B]2-3 \[dq]x\[dq]\f[R] matches \f[B]\[lq]xx\[rq]\f[R] or
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]\[lq]xxx\[rq]\f[R])
|
|
|
|
.TP
|
|
|
|
\f[I]N\f[R]\f[B]+\f[R] \f[I]pat\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
At least \f[I]N\f[R] or more repetitions of \f[I]pat\f[R]
|
|
|
|
(e.g.\ \f[B]2+ \[dq]x\[dq]\f[R] matches \f[B]\[lq]xx\[rq]\f[R],
|
|
|
|
\f[B]\[lq]xxx\[rq]\f[R], \f[B]\[lq]xxxx\[rq]\f[R], etc.)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]*\f[R] \f[I]pat\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
Some \f[I]pat\f[R]s (zero or more, e.g.\ \f[B]* \[dq]x\[dq]\f[R] matches
|
2021-07-17 14:19:55 -07:00
|
|
|
\f[B]\[lq]\[lq]\f[R], \f[B]\[rq]x\[rq]\f[R], \f[B]\[lq]xx\[rq]\f[R],
|
2021-05-19 22:02:45 -07:00
|
|
|
etc.)
|
|
|
|
.TP
|
|
|
|
\f[B]+\f[R] \f[I]pat\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
At least one \f[I]pat\f[R]s (e.g.\ \f[B]+ \[dq]x\[dq]\f[R] matches
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]\[lq]x\[rq]\f[R], \f[B]\[lq]xx\[rq]\f[R], \f[B]\[lq]xxx\[rq]\f[R],
|
|
|
|
etc.)
|
|
|
|
.TP
|
|
|
|
\f[I]repeating-pat\f[R] \f[B]%\f[R] \f[I]sep\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
\f[I]repeating-pat\f[R] (see the examples above) separated by
|
|
|
|
\f[I]sep\f[R] (e.g.\ \f[B]*word % \[dq],\[dq]\f[R] matches zero or more
|
|
|
|
comma-separated words)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]..\f[R] \f[I]pat\f[R]
|
|
|
|
Any text (except newlines) up to and including \f[I]pat\f[R]
|
|
|
|
.TP
|
|
|
|
\f[B].. %\f[R] \f[I]skip\f[R] \f[I]pat\f[R]
|
|
|
|
Any text (except newlines) up to and including \f[I]pat\f[R], skipping
|
2021-05-23 15:21:46 -07:00
|
|
|
over instances of \f[I]skip\f[R]
|
|
|
|
(e.g.\ \f[B]\[aq]\[dq]\[aq] ..%(\[aq]\[rs]\[aq] .) \[aq]\[dq]\[aq]\f[R]
|
|
|
|
opening quote, up to closing quote, skipping over backslash followed by
|
|
|
|
a single character)
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
2021-07-30 19:24:35 -07:00
|
|
|
\f[B].. =\f[R] \f[I]only\f[R] \f[I]pat\f[R]
|
|
|
|
Any number of repetitions of the pattern \f[I]only\f[R] up to and
|
|
|
|
including \f[I]pat\f[R] (e.g.\ \f[B]\[dq]f\[dq] ..=abc \[dq]k\[dq]\f[R]
|
|
|
|
matches the letter \[lq]f\[rq] followed by some alphabetic characters
|
|
|
|
and then a \[lq]k\[rq], which would match \[lq]fork\[rq], but not
|
|
|
|
\[lq]free kit\[rq]) This is essentially a \[lq]non-greedy\[rq] version
|
|
|
|
of \f[B]*\f[R], and \f[B].. pat\f[R] can be thought of as the special
|
|
|
|
case of \f[B]..=. pat\f[R]
|
|
|
|
.TP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]<\f[R] \f[I]pat\f[R]
|
2021-05-20 17:26:38 -07:00
|
|
|
Matches at the current position if \f[I]pat\f[R] matches immediately
|
|
|
|
before the current position (lookbehind).
|
|
|
|
Conceptually, you can think of this as creating a file containing only
|
|
|
|
the \f[I]N\f[R] characters immediately before the current position and
|
|
|
|
attempting to match \f[I]pat\f[R] on that file, for all values of
|
|
|
|
\f[I]N\f[R] from the minimum number of characters \f[I]pat\f[R] can
|
|
|
|
match up to maximum number of characters \f[I]pat\f[R] can match (or the
|
|
|
|
length of the current line upto the current position, whichever is
|
|
|
|
smaller).
|
|
|
|
\f[B]Note:\f[R] For fixed-length lookbehinds, this is quite efficient
|
2021-05-23 15:21:46 -07:00
|
|
|
(e.g.\ \f[B]<(100 \[dq]x\[dq])\f[R]), however this could cause
|
|
|
|
performance problems with variable-length lookbehinds
|
|
|
|
(e.g.\ \f[B]<(\[dq]x\[dq] 0-100\[dq]y\[dq])\f[R]).
|
|
|
|
Also, it is worth noting that \f[B]\[ha]\f[R], \f[B]\[ha]\[ha]\f[R],
|
|
|
|
\f[B]$\f[R], and \f[B]$$\f[R] all match against the edges of the slice,
|
|
|
|
which may give false positives if you were expecting them to match only
|
|
|
|
against the edges file or line.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]>\f[R] \f[I]pat\f[R]
|
2021-05-20 17:26:38 -07:00
|
|
|
Matches \f[I]pat\f[R], but does not consume any input (lookahead).
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[B]\[at]\f[R] \f[I]pat\f[R]
|
|
|
|
Capture \f[I]pat\f[R]
|
|
|
|
.TP
|
|
|
|
\f[B]foo\f[R]
|
|
|
|
The named pattern whose name is \f[B]\[lq]foo\[rq]\f[R].
|
|
|
|
Pattern names come from definitions in grammar files or from named
|
|
|
|
captures.
|
|
|
|
Pattern names may contain dashes (\f[B]-\f[R]), but not underscores
|
|
|
|
(\f[B]_\f[R]), since the underscore is used to match whitespace.
|
|
|
|
See the \f[B]GRAMMAR FILES\f[R] section for more info.
|
|
|
|
.TP
|
|
|
|
\f[B]\[at]\f[R] \f[I]name\f[R] \f[B]=\f[R] \f[I]pat\f[R]
|
|
|
|
Let \f[I]name\f[R] equal \f[I]pat\f[R] (named capture).
|
2021-05-23 15:21:46 -07:00
|
|
|
Named captures can be used as backreferences like so:
|
|
|
|
\f[B]\[at]foo=word \[ga]( foo \[ga])\f[R] (matches
|
|
|
|
\f[B]\[lq]asdf(asdf)\[rq]\f[R] or \f[B]\[lq]baz(baz)\[rq]\f[R], but not
|
|
|
|
\f[B]\[lq]foo(baz)\[rq]\f[R])
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
2021-05-23 15:21:46 -07:00
|
|
|
\f[I]pat\f[R] \f[B]=>\f[R] \f[B]\[dq]\f[R]\f[I]replacement\f[R]\f[B]\[dq]\f[R]
|
2021-05-19 22:02:45 -07:00
|
|
|
Replace \f[I]pat\f[R] with \f[I]replacement\f[R].
|
2021-05-23 15:21:46 -07:00
|
|
|
Note: \f[I]replacement\f[R] should be a string (single or double
|
|
|
|
quoted), and it may contain escape sequences (e.g.\ \f[B]\[rs]n\f[R]) or
|
2021-05-19 22:02:45 -07:00
|
|
|
references to captured values: \f[B]\[at]0\f[R] (the whole of
|
|
|
|
\f[I]pat\f[R]), \f[B]\[at]1\f[R] (the first capture in \f[I]pat\f[R]),
|
|
|
|
\f[B]\[at]\f[R]\f[I]foo\f[R] (the capture named \f[I]foo\f[R] in
|
|
|
|
\f[I]pat\f[R]), etc.
|
2021-05-23 15:21:46 -07:00
|
|
|
For example,
|
|
|
|
\f[B]\[at]word _ \[at]rest=(*word % _) => \[dq]\[at]rest:\[rs]n\[rs]t\[at]1\[dq]\f[R]
|
|
|
|
matches a word followed by whitespace, followed by a series of words and
|
|
|
|
replaces it with the series of words, a colon, a newline, a tab, and
|
|
|
|
then the first word.
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
2021-05-19 23:41:57 -07:00
|
|
|
\f[I]pat1\f[R] \f[B]\[ti]\f[R] \f[I]pat2\f[R]
|
|
|
|
Matches when \f[I]pat1\f[R] matches and \f[I]pat2\f[R] can be found
|
|
|
|
within the text of that match.
|
|
|
|
(e.g.\ \f[B]comment \[ti] {TODO}\f[R] matches comments that contain the
|
|
|
|
word \f[B]\[lq]TODO\[rq]\f[R])
|
|
|
|
.TP
|
|
|
|
\f[I]pat1\f[R] \f[B]!\[ti]\f[R] \f[I]pat2\f[R]
|
|
|
|
Matches when \f[I]pat1\f[R] matches, but \f[I]pat2\f[R] can not be found
|
|
|
|
within the text of that match.
|
|
|
|
(e.g.\ \f[B]comment \[ti] {IGNORE}\f[R] matches only comments that do
|
|
|
|
not contain the word \f[B]\[lq]IGNORE\[rq]\f[R])
|
2021-05-19 22:02:45 -07:00
|
|
|
.TP
|
|
|
|
\f[I]name\f[R]\f[B]:\f[R] \f[I]pat\f[R]
|
|
|
|
Define \f[I]name\f[R] to mean \f[I]pat\f[R] (pattern definition)
|
|
|
|
.TP
|
2021-05-20 00:46:53 -07:00
|
|
|
\f[B](!)\f[R] \f[I]error-pat\f[R]
|
|
|
|
If \f[I]error-pat\f[R] matches, \f[B]bp\f[R] will not print any results
|
2021-05-20 13:05:47 -07:00
|
|
|
in this file and instead print an error message to \f[B]STDERR\f[R]
|
|
|
|
highlighting the matching position of \f[I]error-pat\f[R] in the file
|
|
|
|
and printing the text of \f[I]error-pat\f[R] as an error message.
|
2021-05-20 00:46:53 -07:00
|
|
|
Then, \f[B]bp\f[R] will exit with a failure status and not process any
|
|
|
|
further files.
|
|
|
|
.TP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]#\f[R] \f[I]comment\f[R]
|
2020-09-28 16:36:26 -07:00
|
|
|
A line comment
|
2021-05-19 22:02:45 -07:00
|
|
|
.SH GRAMMAR FILES
|
|
|
|
.PP
|
|
|
|
\f[B]bp\f[R] allows loading extra grammar files, which define patterns
|
|
|
|
which may be used for matching.
|
|
|
|
The \f[B]builtins\f[R] grammar file is loaded by default, and it defines
|
|
|
|
a few useful general-purpose patterns.
|
|
|
|
For example, it defines the \f[B]parens\f[R] rule, which matches pairs
|
|
|
|
of matching parentheses, accounting for nested inner parentheses:
|
2021-05-23 15:21:46 -07:00
|
|
|
.RS
|
|
|
|
.PP
|
|
|
|
\f[B]bp -p \[aq]\[dq]my_func\[dq] parens\[aq]\f[R]
|
|
|
|
.RE
|
2021-05-19 22:02:45 -07:00
|
|
|
.PP
|
|
|
|
\f[B]bp\f[R] also comes with a few grammar files for common programming
|
|
|
|
languages, which may be loaded on demand.
|
|
|
|
These grammar files are not comprehensive syntax definitions, but only
|
|
|
|
some common patterns.
|
|
|
|
For example, the c++ grammar file contains definitions for
|
2021-05-23 15:21:46 -07:00
|
|
|
\f[B]//\f[R]-style line comments as well as \f[B]/*...*/\f[R]-style
|
2021-05-19 22:02:45 -07:00
|
|
|
block comments.
|
2021-05-19 23:41:57 -07:00
|
|
|
Thus, you can find all comments with the word \[lq]TODO\[rq] with the
|
2021-05-19 22:02:45 -07:00
|
|
|
following command:
|
2021-05-23 15:21:46 -07:00
|
|
|
.RS
|
|
|
|
.PP
|
|
|
|
\f[B]bp -g c++ -p \[aq]comment \[ti] {TODO}\[aq] *.cpp\f[R]
|
|
|
|
.RE
|
2020-09-11 01:54:26 -07:00
|
|
|
.SH EXAMPLES
|
2021-05-23 15:21:46 -07:00
|
|
|
.PP
|
|
|
|
Find files containing the string \[lq]foo\[rq] (a string pattern):
|
|
|
|
.RS
|
|
|
|
.PP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]ls | bp foo\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
.RE
|
|
|
|
.PP
|
|
|
|
Find files ending with \[lq].c\[rq] and print the name with the
|
|
|
|
\[lq].c\[rq] replaced with \[lq].h\[rq]:
|
|
|
|
.RS
|
|
|
|
.PP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]ls | bp \[aq].c\[rs]$\[aq] -r \[aq].h\[aq]\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
.RE
|
|
|
|
.PP
|
|
|
|
Find the word \[lq]foobar\[rq], followed by a pair of matching
|
|
|
|
parentheses in the file \f[I]my_file.py\f[R]:
|
|
|
|
.RS
|
|
|
|
.PP
|
2021-05-19 22:02:45 -07:00
|
|
|
\f[B]bp -p \[aq]{foobar} parens\[aq] my_file.py\f[R]
|
2021-05-23 15:21:46 -07:00
|
|
|
.RE
|
|
|
|
.PP
|
2021-05-19 23:41:57 -07:00
|
|
|
Using the \f[I]html\f[R] grammar, find all \f[I]element\f[R]s matching
|
2021-05-23 15:21:46 -07:00
|
|
|
the tag \f[I]a\f[R] in the file \f[I]foo.html\f[R]:
|
|
|
|
.RS
|
|
|
|
.PP
|
|
|
|
\f[B]bp -g html -p \[aq]element \[ti] (\[ha]\[ha]\[dq]<a \[dq])\[aq] foo.html\f[R]
|
|
|
|
.RE
|
2021-05-19 22:02:45 -07:00
|
|
|
.SH AUTHORS
|
|
|
|
Bruce Hill (\f[I]bruce\[at]bruce-hill.com\f[R]).
|