【问题标题】:putting text before the nth occurence in each line in Vim在 Vim 的每一行中将文本放在第 n 次出现之前
【发布时间】:2014-03-16 05:41:12
【问题描述】:

我有这样的情况

something 'text' something 'moretext'

我第一次创建此文件时忘记添加更多间距,现在在每一行我应该在第二次出现 ' 之前添加一些空格。

现在我无法为此构建正则表达式。

我知道:

  • 我的命令应该以:%s 开头,因为我希望它在所有行上都执行
  • 我应该使用{2} 运算符来选择第二次出现吗?
  • 如果我的正则表达式匹配某些内容,我可以在匹配之前添加内容 &

对我来说主要的问题是如何使用{} 表示法构建一个正则表达式来匹配第二个',这很令人沮丧,因为我不知道它应该插入的位置,或者我应该使用魔法还是非魔法-vim 中的魔法正则表达式。

我正在寻找的结果

something 'text ' something 'moretext'

【问题讨论】:

  • 这样的正则表达式对于vim 用户来说并不那么受欢迎,这真的很奇怪,我找不到任何接近这个的东西,找到第 n 个应该不会更容易字符的出现?

标签: regex vim


【解决方案1】:

你可以使用

:%s:\v(^[^']*'[^']*)':\1 ':
  • [^'] 表示除' 之外的所有内容
  • \1 是对第一个捕获的组的反向引用(...)

基本上,您在这里所做的就是捕获直到第二个引用的所有内容,并用您捕获的内容、空格和引用替换(包括)此引用的行。

【讨论】:

  • 所以它基本上不是插入,而是搜索和替换。我希望了解如何使用那个神秘的{} 运算符
  • 你忘了\v 它对我有用,但就像:%s/\v(^[^']*'[^']*)'/\1 '/
  • 谢谢,已编辑。是的,这确实是一个搜索和替换。重新阅读您的问题,它确实指定您要使用 {} 表示法,但我不熟悉它,无法帮助您。如果您想以您的特定方式回答问题,您可能应该尝试在您的问题中使其更加突出。玩得开心!
  • @user2485710:this 是否相关?
  • @user2485710: 一样,只是我觉得它更具可读性。 :s 命令要求模式和替换字符串在 3 个相等的符号内(通常,如答案 /)。但它们可以是任何东西。通常你有一些\` in the regex, I find much more readable to use something different from /` 来分隔模式和替换字符串。我的选择通常落在: (除非我需要在需要: 的地方进行替换)
【解决方案2】:

{2} 不是“第二场比赛”的意思,而是“两场比赛”的意思,所以对任务完全没用。

您可以使用像这样的替代品或 Robin 的回答中的替代品:

:%s/[^']*'[^']*\zs'/ '

或者你可以使用这样的东西:

:g/ '[^']*' /norm 2f'i<space>

【讨论】:

  • 好的,所以我错了,但是当你想要正则表达式中的“2 个匹配项”时?听起来更像是条件而不是正则表达式构造。
  • 量词非常有用。您更愿意如何匹配 10 位数字? [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\d\d\d\d\d\d\d\d\d\d\d\{10}?
【解决方案3】:

另一种方法:

:%s/\v%([^']*\zs\ze'){2}/ /

注意:我正在使用非常神奇的 \v 来减少转义量。

这种方法使用\zs\ze 来设置匹配的开始和结束。 \zs\ze 由于量词 {2} 而被多次设置,但组的每次出现都会改变 \zs\ze 的位置。

如需更多帮助,请参阅:

:h /\zs
:h /\v

当然总是有 sed,但诀窍是正确地转义引号。

:%!sed -e 's/'\''/ &/2'

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 2012-06-16
    • 2020-09-02
    • 2021-12-19
    • 1970-01-01
    • 2011-03-05
    • 2011-11-02
    • 2017-03-15
    • 2021-09-30
    相关资源
    最近更新 更多