Vim中的数学搜索和替换

Phi*_*ppe 23 regex vim evaluation

我有一个有时间(分钟和秒)的文件,看起来大致如下:

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...
...
Run Code Online (Sandbox Code Playgroud)

我想在几秒钟内将时间替换为等效时间.理想情况下,我想运行这样一个神奇的命令:

:%s/^\(\d\d\):\(\d\d\) \(.*\)/(=\1*60 + \2) \3/g
Run Code Online (Sandbox Code Playgroud)

......这(=\1*60 + \2)是神奇的部分.我知道我可以使用特殊寄存器插入评估结果=,但有没有办法在正则表达式的替代部分执行此操作?

FDi*_*off 36

像这样的东西?

:%s/^\(\d\d\):\(\d\d\)/\=submatch(1)*60+submatch(2)/
Run Code Online (Sandbox Code Playgroud)

当替换开始时,替换\=被解释为表达式.

:h sub-replace-expression 复制如下

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 ().
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`/`通常在`sub-replace-expression`中也有特殊含义(它结束了它),但是,如果使用`s ###`代替`s ///`,则可以使用` /`(除法)在子表达式中自由。/sf/answers/2105082801/ (2认同)

Bir*_*rei 6

使用submatch()是指在替代地方分组的一部分:

:%s/\v^(\d{2}):(\d{2})>/\=submatch(1) * 60 + submatch(2)/
Run Code Online (Sandbox Code Playgroud)

与您的示例产量:

173 rest of line 1...
190 rest of line 2...
334 rest of line 3...
335 rest of line 4...
602 rest of line 5...
Run Code Online (Sandbox Code Playgroud)