在找到的区域内进行替换

在找到的区域内进行替换

我有一个 TSV 文件,其第 8 列是描述列。描述有时包含标签,我想将其转义为\t

我目前正在使用以下重复多次的正则表达式:

%s#\v([^\t]*\t){8}[^\t]*\zs\t#\\t#

但事实证明,这种做法效率太低。

我想选择第 8 列之后的所有内容,/\v([^\t]*\t){8}\zs.*然后s#\t#\\t#g在这些区域运行简单的正则表达式。

这一定是可能的。如何实现呢?

答案1

将第 7 列之后的所有内容匹配为一个字符串 ( .*),然后使用内部substitute()函数调用应用制表符的转义,通过以下方式调用:help sub-replace-special

:%s#\v([^\t]*\t){8}[^\t]*\zs.*#\=substitute(submatch(0), '\t', '\\t', 'g')#

插件替代品

我的PatternsOnText 插件提供了(除其他外)一个:[range]SubstituteInSearch/{search}/{pattern}/{string}/[flags] [count]简化此操作的命令:

:%SubstituteInSearch /\v([^\t]*\t){8}[^\t]*\zs.*/\t/\\t/g

相关内容