【问题标题】:Vim. Add * to the end of each word between slashes维姆。在斜线之间的每个单词的末尾添加 *
【发布时间】:2021-11-08 05:57:53
【问题描述】:

我有文字:

alpha/beta/gamma
alpbeta/gamma
alpha/beta/gamma
This is an example.  Test1,Test2,Test3
alpha/beta/gamma
This is an example.
Test1,Test2,Test3

我想在斜线 (/) 之间的每个单词的末尾添加 *,但 vim 没有发现我的模式...

我的命令:

:%s/\/(.*?)\//*/g

我想要的结果:

alpha/beta*/gamma
alpbeta/gamma
alpha/beta*/gamma
This is an example.  Test1,Test2,Test3
alpha/beta*/gamma
This is an example.
Test1,Test2,Test3

【问题讨论】:

  • 那么,如果你的输入是a/b c d/ee fff/ g hh/,你想得到a/b* c* d*/ee fff/ g* hh*/?能否请您详细说明一下要求?
  • @WiktorStribiżew 我编辑了我的问题并添加了首选结果

标签: regex vim vi


【解决方案1】:

Vim 使用自己的正则表达式方言,其中:

  • .*? 中的*? 毫无意义,
  • 分组括号必须用反斜杠转义,
  • 以及与其他方言的各种其他差异……

就目前而言,您的模式将匹配:

  • 斜线,\/
  • 后跟一个左括号,(
  • 后跟 0 个或多个任意字符,.*
  • 后跟一个问号,?
  • 后跟右括号)
  • 后跟另一个斜线,\/

在您的示例中找不到。

:help perl-patterns

【讨论】:

  • 谢谢!我想我现在很接近了,但是新的正则表达式匹配带有斜杠的单词,但我需要在括号之间使用单词。新的正则表达式:\/.*\/
【解决方案2】:

你可以使用

:%s/\/[[:alpha:]]\+\ze\//&*/g

甚至

:%s/\/[^\/]*\ze\//&*/g

这里,模式是\/[[:alpha:]]\+\ze\/

  • \/[[:alpha:]]\+ - 消费部分:/ 然后是一个或多个字母
  • [^\/]* - 除了/ 之外的零个或多个字符
  • \ze\/ - 使用文本的结尾,然后必须跟随一个 / 字符(就好像它是常见 NFA 正则表达式中的 (?=\/) 正向前瞻一样)。

替换的是&,它代表整个匹配值和一个* char。

g 标志替换所有匹配项。

【讨论】:

  • 在这里使用不同的分隔符可能会有所帮助,例如:%s#/[^/]*\zs#*&#g
【解决方案3】:

根据您的示例,您似乎希望在该行中最后一次出现 / 之前有一个 *

我会录制一个执行$F/i*^VESCj 的宏(其中^VCTRL+VESCESC

这意味着转到行尾,向后找到/,进入插入模式,输入*,回到正常模式,下一行。

您可以将其录制为宏,并使用 :%normal @x 之类的内容播放整个文件(如果您在 x 上录制)

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多