如何使用反向引用替换部分字符串?
How to use backreference to replace part of the string?
.*\t.*\t.*\t.*
我有一个 4 列 table,上面有 3 个选项卡。如何将 vim 中的第二个和第三个选项卡替换为逗号?我试图使用 vim 来做到这一点,但失败了。
这是一种方法:
:%s/\(\t.\{-}\)\@<=\t/,/g
它使用后向匹配来查找行中先前出现的制表符,因此它将匹配除第一个制表符之外的所有制表符,因此它将替换第二个、第三个、第四个等制表符逗号。有关后视运算符的帮助,请参阅 :help /\@<=
。
另一种方法,只匹配一行的第二个和第三个制表符,并且只匹配至少有两个制表符的行,是使用反向引用 </code> 来存储和引用制表符之间的内容.</p>
<pre><code>:%s/\t.\{-\}\zs\t\(.\{-}\)\t/,,/
这也使用 .\{-}
,它匹配 0 个或多个字符,但它是非贪婪的(因此它尝试匹配可能的最小序列并保持接近行的开头)以及 \zs
标记仅在匹配的那部分开始替换(就在该行的第二个选项卡之前。)再次,请参阅 Vim 关于搜索模式的帮助文档以获取所有这些的更多详细信息。
.*\t.*\t.*\t.*
我有一个 4 列 table,上面有 3 个选项卡。如何将 vim 中的第二个和第三个选项卡替换为逗号?我试图使用 vim 来做到这一点,但失败了。
这是一种方法:
:%s/\(\t.\{-}\)\@<=\t/,/g
它使用后向匹配来查找行中先前出现的制表符,因此它将匹配除第一个制表符之外的所有制表符,因此它将替换第二个、第三个、第四个等制表符逗号。有关后视运算符的帮助,请参阅 :help /\@<=
。
另一种方法,只匹配一行的第二个和第三个制表符,并且只匹配至少有两个制表符的行,是使用反向引用 </code> 来存储和引用制表符之间的内容.</p>
<pre><code>:%s/\t.\{-\}\zs\t\(.\{-}\)\t/,,/
这也使用 .\{-}
,它匹配 0 个或多个字符,但它是非贪婪的(因此它尝试匹配可能的最小序列并保持接近行的开头)以及 \zs
标记仅在匹配的那部分开始替换(就在该行的第二个选项卡之前。)再次,请参阅 Vim 关于搜索模式的帮助文档以获取所有这些的更多详细信息。