【问题标题】:searching and replace without consuming what you are searching for搜索和替换而不消耗您正在搜索的内容
【发布时间】:2013-04-22 16:21:22
【问题描述】:

假设我有这样的行:

'alpha' 123 
'beta' 678
'alpha' 998
'gamma' 212

并使用 VIM 中的搜索和替换正则表达式,将其变为:

'alpha' 123 : alpha
'beta' 678 : beta
'alpha' 998 : alpha
'gamma' 212 : gamma

基本上,搜索不会替换它正在搜索的内容,而只是将其用于其他内容。在我看来,这应该可行:

:g/'\(.*\)'/s/$/: \1/g

但这并没有做到。如何不消耗我正在搜索的内容,而是保留它以供使用?

【问题讨论】:

    标签: regex vim


    【解决方案1】:

    匹配的初始g 不捕获替换;它仅用于分组搜索。而是使用这个,它也更简单一点:

    %s/'\(.*\)'.*/& : \1/
    

    & 替换所有匹配的内容。

    【讨论】:

    • 我正在使用 sidyll 给出的示例的变体,但这也很好:-)
    【解决方案2】:

    您可以直接在替换命令中执行此操作,使用 \zs 这是 对于构建诸如零宽度匹配之类的东西非常有用( “消费”)。

    :%s/'\(.*\)'.*\zs/ : \1
    

    \zs 标志着比赛的开始。这就像“开始比赛 这里”。所以,首先捕获括号的内容,然后是额外的 .* 匹配到行尾的所有内容,\zs 现在重置 到那一点的匹配,这意味着根本不是匹配的一部分,而是 括号的内容被捕获。

    替换部分用: 和 匹配组。

    :h \zs

    【讨论】:

    • 这正是我所希望的!谢谢!
    【解决方案3】:

    这个命令应该可以工作:

    :%s/\v'(\w*)'.*/\0 : \1
    

    (好吧,它在这里与您的示例文本一起使用)

    【讨论】:

      【解决方案4】:

      宏也适用于您的示例:(未在 vim 中测试,但应该可以。)

      光标在第一行的开头:

      qqyi'A : <esc>pjq
      

      然后x@q(x是你想做多少次)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 2019-01-27
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        相关资源
        最近更新 更多