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)
我使用了上面的表达式,但我得到了错误的输出。
捕获组可: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_-]不匹配文字.,但会出现在你的榜样。.(as \.); 它会匹配任何字符。