首页 > 解决方案 > 使用 vim 正则表达式在匹配字符串之前/之后添加/追加字符或字符串

问题描述

假设你有一个这样的列表:

file_exts = [tex~, log~, synctex.gz, aux, synctex, tuc, fls, log, fdb_latexmk, bcf, bbl, blg]

我想用单引号将每个元素括起来。有没有办法像这样在 Vim 中有效地做到这一点?:

file_exts = ['tex~', 'log~', 'synctex.gz', 'aux', 'synctex', 'tuc', 'fls', 'log', 'fdb_latexmk', 'bcf', 'bbl', 'blg']

第二种情况如下。如果我想在某些行的末尾附加一个字符串,字符串匹配但不替换字符串本身,我该怎么做?这是一个例子

His name is Evan
His phonenumber is 333-444

我想.../his.

His name is Evan...
His phonenumber is 333-444...

我知道我可以通过行号来做到这一点,但在我的用例中是不可能的。

标签: vimvi

解决方案


对于第一个问题。您可以选择其中的内容[ ... ](例如通过键入vi[),然后执行以下命令:

:'<,'>s/\%V\([a-z~.]\+\)/'\1'/g

现在我将解释命令的每个部分

  1. '<,'>是一个范围,这意味着我们只想将以下命令应用于选定的行,而不是整个文件。vim当您在可视模式下启动命令时,通常会自动插入它。
  2. 类似地\%V,这里的意思是“限制可视区域内的匹配”。范围从1.限制仅匹配选定的,而不匹配选定的字符。我们需要\%V防止将命令应用于file_exts单词。
  3. s/pattern/replacement/只是一个替代命令:它将指定的替换为指定patternreplacement.
  4. [a-z~.]\+只是一个正则表达式,这意味着“匹配列表中一个或多个字符的序列:a-z或”。~.
  5. 我们不想替换,而是修改现有项目。因此,在模式部分中,我们将其与\( ... )构造一起保存到(有点)寄存器中,稍后\1在替换部分中使用它。所以更换零件只是'\1'
  6. 默认情况下vim,每行仅应用一次替换。我们想多次应用它,所以我们g在命令末尾添加了标志。

这可能不是最简单的方法,但相当简单且易于为类似任务定制。

如果您想了解每个主题的更多详细信息,可以查看 vim 帮助:

:help '<
:help '>
:help \%V
:help pattern
:help :s
:help s/\1
:help s_flags

对于第二个问题:除了g/评论中提到的解决方案外,您还可以使用:s

:'<,'>s/\(Evan\|444\)$/\1...

推荐阅读