vi 编辑器中的替换

sha*_*has 0 vim vi regular-expression variable-substitution

我有一个名为foo.txt. 此文件包含值:

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
Run Code Online (Sandbox Code Playgroud)

我想得到这样的输出

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
Run Code Online (Sandbox Code Playgroud)

相同的值/文本必须出现在原始值/文本之前。如何使用正则表达式实现这一点?

%s/^[a-z_-]*./\1/g
Run Code Online (Sandbox Code Playgroud)

我使用了上面的表达式,但我得到了错误的输出。

Ing*_*kat 5

捕获组可:help /\(让您存储与内部模式匹配的内容 \(...\);然后,您可以在替换中(甚至在模式本身之后)引用匹配项(通过\1第一组,\2等等)。

您的问题的一种方法(有很多)是在.tar.gz扩展名之前捕获文件名。在替换中,放置捕获(\1),一个空格,然后是原始文本(\0, 或&):

:%substitute/\(.*\)\.tar\.gz$/\1 &/
Run Code Online (Sandbox Code Playgroud)

或者,您可以只匹配扩展名之前的内容(以 结束匹配\ze),然后复制它:

:%substitute/.*\ze\.tar\.gz$/& &/
Run Code Online (Sandbox Code Playgroud)

你的尝试有问题

  • 您使用了反向引用\1,但从未捕获任何内容。
  • [a-z_-]不匹配文字.,但会出现在你的榜样。
  • 没有转义 final .(as \.); 它会匹配任何字符。
  • 更换零件无重复;您有效地删除了文本而不是添加。