Vim。在斜杠之间的每个单词的末尾添加 *

Vim. Add * to the end of each word between slashes

我有文字:

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

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

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

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

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

在您的示例中无处可寻。

:help perl-patterns

您可以使用

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

甚至

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

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

  • \/[[:alpha:]]\+ - 消耗部分:/ 然后是一个或多个字母
  • [^\/]* - /
  • 以外的零个或多个字符
  • \ze\/ - 消耗的文本结束,然后必须跟随一个 / 字符(就好像它是常见 NFA 正则表达式中的 (?=\/) 正向先行)。

替换为 &,代表整个匹配值和 * 个字符。

g 标志替换所有匹配项。

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

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

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

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