我有一个 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