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:
-Sto use parenthesis-matching and implicit whitespace, a.k.a "space mode".-Fto interpret the pattern as a literal string to find, same as-Fin 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.