vim - 使用 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...
我知道我可以通过行号来做到这一点,但在我的用例中是不可能的。
解决方案
对于第一个问题。您可以选择其中的内容[ ... ]
(例如通过键入vi[
),然后执行以下命令:
:'<,'>s/\%V\([a-z~.]\+\)/'\1'/g
现在我将解释命令的每个部分
'<,'>
是一个范围,这意味着我们只想将以下命令应用于选定的行,而不是整个文件。vim
当您在可视模式下启动命令时,通常会自动插入它。- 类似地
\%V
,这里的意思是“限制可视区域内的匹配”。范围从1.
限制仅匹配选定的行,而不匹配选定的字符。我们需要\%V
防止将命令应用于file_exts
单词。 s/pattern/replacement/
只是一个替代命令:它将指定的替换为指定pattern
的replacement
.[a-z~.]\+
只是一个正则表达式,这意味着“匹配列表中一个或多个字符的序列:a
-z
或”。~
.
- 我们不想替换,而是修改现有项目。因此,在模式部分中,我们将其与
\( ... )
构造一起保存到(有点)寄存器中,稍后\1
在替换部分中使用它。所以更换零件只是'\1'
。 - 默认情况下
vim
,每行仅应用一次替换。我们想多次应用它,所以我们g
在命令末尾添加了标志。
这可能不是最简单的方法,但相当简单且易于为类似任务定制。
如果您想了解每个主题的更多详细信息,可以查看 vim 帮助:
:help '<
:help '>
:help \%V
:help pattern
:help :s
:help s/\1
:help s_flags
对于第二个问题:除了g/
评论中提到的解决方案外,您还可以使用:s
:
:'<,'>s/\(Evan\|444\)$/\1...
推荐阅读
- javascript - 如何在加载时检查数字或选中的复选框?
- c# - Visual Studio 中方形/菱形断点的含义是什么?
- php - 使图像可单击并单击在新窗口中打开相应的文本文件
- linux - 如何在字符串中捕获返回码并重新运行
- c# - 从 JSON 中删除节点并将子节点向上移动
- docker - DAG 未加载到气流中
- microsoft-teams - Microsoft Teams:未在具有 ngrok 的消息传递端点上接收消息
- java - 在我的适配器中,我无法更改 onClickListener 中的定义值
- json-api - 如何在 JSON:API 中编写两个字的类型?
- java - ASCII 字符删除不起作用