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 \.
); 它会匹配任何字符。