如何在shell脚本中仅从字符串中剪切“test2-test”

时间:2018-04-10 12:51:00

标签: bash shell

如何从var =“./ test3 / test2-test-10.23-67.tar.gz”中删除单词“test2-test”

“test2-test”可以是任何名称, 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

你可以像这样使用子串替换:

var="./test3/test2-test-10.23-67.tar.gz"
echo ${var/test2-test/}

输出:./test3/-10.23-67.tar.gz

详细了解manipulating strings

更新答案以仅使用字符串替换和basename保留路径中的文件名:

basename ${var/-[0-9]*.*/}

输出:test2-test

答案 1 :(得分:0)

@Carloluis的答案很好,但我认为这个问题没有得到恰当的解决。

@Samresh希望从./test3/test2-test-10.23-67.tar.gz删除额外部分,以便只剩下 test2-test

可以通过以下方式完成 -

basename ./test3/test2-test-10.23-67.tar.gz | sed 's/-[[:digit:]].*//'

'basename'将删除路径,因此只保留文件名(test2-test)。 接下来,sed可以匹配正则表达式。因此,我们匹配版本和文件扩展名,并将其替换为空字符串。

这适用于bash 4.2.46。

答案 2 :(得分:0)

@Avi的回答很好,但有点慢。纯粹的打击:

#!/bin/bash

var="./test3/test2-test-10.23-67.tar.gz"
var=${var##*/}
var=${var%%-[0-9]*}
echo $var

10000次迭代速度快100倍

bash   <  sed+basename (no builtin command)
129 ms < 13006 ms