spacemod
Matching modes
By default, your pattern is interpreted as a regular RE2-style regex using regex crate.
spacemod
provides two flags to change that:
-S
to use parenthesis-matching and implicit whitespace, a.k.a "space mode".-F
to interpret the pattern as a literal string to find, same as-F
in fastmod.
-S
requires further explanation. Let's motivate it with an example:
vec!["foo".to_string(), "bar".to_string(), "baz".to_string()]
You get the terrible idea of changing all of your x.to_string()
calls to
String::from(x)
instead.
In fastmod
, or any regex-based search-and-replace, you'd write:
fastmod '"(.*)"\.to_string\(\)' 'String::from("$1")'
You forgot about the greediness of .*
and should've maybe written .*?
instead. Now your code looks like:
vec![String::from(String::from(String::from("foo"), "bar"), "baz")]
Let's try that again. spacemod
lets you write:
spacemod -S '" (.*) " \.to_string ( )' 'String::from("$1")'
The correct end result looks like:
vec![String::from("foo"), String::from("bar"), String::from("baz")]
Spacing out parenthesis and quotes tells spacemod that those tokens, ""
and ()
:
- must be balanced wherever they appear in a match
- can have surrounding whitespace (including newlines)
- are literals (fewer backslashes!)
As a result of implicit whitespace, spacemod would have also found all matches in the following code:
" foo".to_string( ) "foo" .to_string()
Syntax reference
spacemod
's pattern syntax consists of tokens delimited by a single space each.
A token can either be a parenthesis/quote, or a substring of a regex:
{ regex1 } regex2 { regex3 }
If you need to use a literal space anywhere in a regex substring, escape it as
\
. That also means escaping a regex like \
as \\
. Backslashes followed
by anything but a space within a regex do not need to be escaped.
spacemod
knows the following parenthesis/quotes:
{}
[]
()
<>
"", ``, ''
. Since start and end are the same, this basically devolves into asserting there is an even number of tokens.
You can extend this list with -p ab
where a
is the opening parenthesis, and
b
the closing counterpart. See --help
for more information.