Vim命令中如何正确转义句点?批量删除行首TESS-1.前缀操作失效问题
问题根因分析
你执行的命令未生效,核心是混淆了Vim不同场景下的转义规则层级,不属于单纯的转义写法错误:
- 转义规则和当前所处的解析上下文强绑定,不存在"见到句点就要加反斜杠"的通用规则
- 正则匹配场景(搜索、替换的匹配模式)下,
.是代表任意单字符的元字符,这个场景要匹配字面的句点,才需要写成\. - 普通模式
f/t的字符查找场景下,后面跟的是字面字符而非正则,直接写.就是匹配字面的句点,根本不需要转义 - Ex命令行给
:norm传参时,反斜杠的作用是给Ex命令行解析器转义特殊字符(比如!、%这类会触发历史/文件名展开的字符),普通的.根本不是Ex层的特殊字符
- 正则匹配场景(搜索、替换的匹配模式)下,
- 你写的
:1,$norm df\.实际执行时,Ex解析器看到反斜杠跟在非特殊字符.前面,会把反斜杠当成普通字符一并传给普通模式的按键序列,也就是普通模式实际收到的指令是:执行d→ 触发f查找\字符 → 删除到找到的位置。因为你的文件里根本没有反斜杠字符,f命令直接执行失败,连带d操作都不会触发,自然没有任何修改效果。
正确的实现方式
- 如果继续用
norm+定位删除的思路,直接去掉多余的反斜杠即可:
这个命令会对范围里的每一行,从行首开始查找第一个字面句点的位置,删除从当前光标到句点之前的内容,刚好删掉每行开头的:1,$norm df.TESS-1部分,保留后面的数字ID。 - 更稳妥的批量修改方案是直接用替换命令,锚定行首固定匹配开头的字符串,不会因为后续列里的小数点出现定位偏差:
这里因为是正则匹配场景,:1,$s/^TESS-1\.//.是元字符,所以必须写成\.匹配字面的句点,直接把行开头固定的TESS-1.字符串替换为空,修改结果完全符合需求,也不受后续列内容的干扰。
注意:如果行内除了开头的分隔句点外,更早的位置就出现了句点,用
norm df.的方法会出现定位偏差,这种场景下优先用锚定行首的替换命令更可靠。
内容的提问来源于stack exchange,提问作者cbjuju
相关产品推荐
相关产品推荐

