【问题标题】:Replacing varying length text over multiple lines in Vim在 Vim 中替换多行不同长度的文本
【发布时间】:2017-05-03 14:04:41
【问题描述】:

假设我在 Vim 中打开了一个文本文件:

Hello Tom. How's your mom?
HellO Sam. Pass me the Jam.
Hell0 Jim. Do you know Vim?

我可以使用视觉块技巧将这三个名字替换为“朋友”。但是如果这三个名字的长度不同呢?

Hello Kat. You're not fat...
HellO Mike. Where's Pike?
Hell0 James. Hunger games?

是否可以用“朋友”代替 Cat、Mike 和 James?如果它们被相同的字符包围怎么样,例如html标签?

Hello <Steph>. You seen Jeff?
HellO <Mat>. Here's your hat.
Hell0 <Jenny>. Got a penny?

如果这些是可行的/容易的,有没有办法为文件中类似段落中的单个段落做到这一点?谢谢

【问题讨论】:

    标签: vim replace vi


    【解决方案1】:

    但是如果三个名字的长度不同呢?

    :%s/\m\w\+\ze\./friend/
    

    这会替换每行第一个句点之前的单词。

    如果它们被相同的字符包围,例如html标签?

    :%s/\m\w\+\ze>\./friend/
    

    这会替换每行第一对 &gt;. 之前的单词。

    还有:

    :%s/\m\<\%(Steph\|Mat\|Jenny\)\>/friend/
    

    这将替换每行中第一次出现的StephMatJenny

    有没有办法对文件中相似段落中的单个段落执行此操作?

    根据“段落”的含义,您可以使用:global。或不。 :)

    【讨论】:

    • 嘿,非常感谢。如果可能,您能否简要概述它们的工作原理?我知道这是一个 sed 替换,但是 \m、\w 和 \% 是什么?
    • 还有\+和\ze
    • 我的意思是多行,但不是全部。
    • @DDauS 启动 Vim 和 :h \m:h \w 等等 :)
    • @sidyll 非常感谢,这个:h 会帮上大忙!
    【解决方案2】:
    :%norm WcWFriend
    
    :  ...... command mode
    %  ...... whole file
    norm .... normal mode
    W ....... big word (jump to)
    cW ...... change word (change it)
    

    Obs:大词包括“-”分隔和html标签

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2011-03-29
      • 2020-09-14
      • 2016-09-11
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多