我有一个名为foo.txt
.该文件包含值:
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
我想得到这样的输出
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
相同的值/文本必须出现在原始值/文本之前。如何使用正则表达式来实现这一点?
%s/^[a-z_-]*./\1/g
我使用了上面的表达式,但输出错误。
答案1
捕获组:help /\(
让你存储与里面的模式匹配的内容 \(...\)
;然后,您可以在替换中(甚至之后在模式本身中)引用匹配(通过\1
第一组,\2
,等等)。
解决您的问题的一种方法(有很多)是在.tar.gz
扩展名之前捕获文件名。在替换中,先放置捕获 ( \1
)、一个空格,然后放置原始文本 ( \0
、 或&
):
:%substitute/\(.*\)\.tar\.gz$/\1 &/
或者,您可以只匹配扩展名之前的内容(以 结束匹配\ze
),然后复制它:
:%substitute/.*\ze\.tar\.gz$/& &/
您的尝试存在问题
- 您使用了反向引用
\1
,但从未捕获任何内容。 - 与
[a-z_-]
文字 不匹配.
,但这出现在您的示例中。 - 无法逃脱最终结局
.
(如\.
);它会匹配任何字符。 - 更换部件无重复;您有效地删除了文本而不是添加了文本。
答案2
如果总是删除.tar.gz,则:
%s/^\(.*\).tar.gz/\1 \1.tar.gz/g
答案3
文件名:testt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
命令
sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"
输出
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
答案4
一定是这样吗vi
?
如果没有,这可能会做你想要的(使用 GNU xargs
)。
cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
foo.txt
你的文件在哪里。
更新。
$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz
$ cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
楼上的你没看懂吗?