vi 编辑器中的替换

vi 编辑器中的替换

我有一个名为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

楼上的你没看懂吗?

相关内容