Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Math in Vim search-and-replace

I have a file with times (minutes and seconds), which looks approximately as follows:

02:53 rest of line 1... 03:10 rest of line 2... 05:34 rest of line 3... 05:35 rest of line 4... 10:02 rest of line 5... ... 

I would like to replace the time by its equivalent in seconds. Ideally, I would like to run some magical command like this:

:%s/^\(\d\d\):\(\d\d\) \(.*\)/(=\1*60 + \2) \3/g 

...where the (=\1*60 + \2) is the magical part. I know I can insert results of evaluation with the special register =, but is there a way to do this in the subst part of a regex?

like image 893
Philippe Avatar asked Sep 18 '13 16:09

Philippe


1 Answers

Something like this?

:%s/^\(\d\d\):\(\d\d\)/\=submatch(1)*60+submatch(2)/ 

When the replacement starts with a \= the replacment is interpreted as an expression.

:h sub-replace-expression is copied below

Substitute with an expression           *sub-replace-expression*                         *sub-replace-\=* When the substitute string starts with "\=" the remainder is interpreted as an expression.  This does not work recursively: a substitute() function inside the expression cannot use "\=" for the substitute string.  The special meaning for characters as mentioned at |sub-replace-special| does not apply except for "<CR>", "\<CR>" and "\\".  Thus in the result of the expression you need to use two backslashes to get one, put a backslash before a <CR> you want to insert, and use a <CR> without a backslash where you want to break the line.  For convenience a <NL> character is also used as a line break.  Prepend a backslash to get a real <NL> character (which will be a NUL in the file).  When the result is a |List| then the items are joined with separating line breaks.  Thus each item becomes a line, except that they can contain line breaks themselves.  The whole matched text can be accessed with "submatch(0)".  The text matched with the first pair of () with "submatch(1)".  Likewise for further sub-matches in (). 
like image 142
FDinoff Avatar answered Sep 24 '22 02:09

FDinoff