Linux 从字符串中删除“;89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz”的;只有那一个;。tar.gz“;

Linux 从字符串中删除“;89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz”的;只有那一个;。tar.gz“;,linux,bash,shell,Linux,Bash,Shell,从字符串89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz中仅删除.tar.gz部分,结果应为89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz。 在具有此扩展名的某些文件中也可能发生这种情况: 91xhq8vkxlkdfpmfg566qahrwkh01c7n0scpdsr4p4vf6.tbz.tar.bz2和其他具有双扩展名tar.tbz tar.zip的文件 在case.tar.zip中,结果必须是nomearchivio.tar在91x

从字符串
89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz
中仅删除
.tar.gz
部分,结果应为
89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz
。 在具有此扩展名的某些文件中也可能发生这种情况:
91xhq8vkxlkdfpmfg566qahrwkh01c7n0scpdsr4p4vf6.tbz.tar.bz2
和其他具有双扩展名tar.tbz tar.zip的文件

在case.tar.zip中,结果必须是
nomearchivio.tar
91xhq8vkxlkdfpmfg566qahrwkh01c7n0scpdsr4p4vf6.tbz.tar.bz2中,结果必须是
91xhq8vkxlfpmfg566qahrwkh01c7n0scpdsr4pvf6.tbz

我用这个:

nameFile= "89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz"
name=${nameFile%.*}
结果是:

echo $name
89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar
你能帮我吗?谢谢


注意,文件名中还有其他点。

您可以使用
sed
删除最后7个字符


echo$nameFile | sed's/\{7\}$/'

既然您确切知道要删除的内容,只需完整编写即可:

name=${nameFile%.tar.gz}
或者删除最后两个“扩展”:

name=${nameFile%.*.*}

您可以尝试
awk
,例如:

echo 89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz | awk -F '\.tgz' '{print $1".tgz"}'
它将输出:

89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz
01c7n0scpdsr4p4vf6.tbz
对于其他文件:

echo "01c7n0scpdsr4p4vf6.tbz.tar.bz2" |  awk -F '\.tbz' '{print $1".tbz"}'
它将输出:

89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz
01c7n0scpdsr4p4vf6.tbz

在本例中,
awk
用作模式的分隔符
-F'\.tbz'
.tgz
tbz
然后打印左侧找到的所有项目+所需的扩展名。

我无法给出此指示,因为我有其他扩展名不同的文件,例如:-91xhq8vkxlkdfpmfg566qahrwkh01c7n0scpdsr4p4vf6.tbz.tar.bz2-m3mcsm8q1g.tgz。那么,一般规则是什么?请更新您的问题以澄清。我必须在变量名中分配您的命令,因为如果我发现其他文件的扩展名为:“91xhq8vkxlkdfpmfg566qahrwkh01c7n0scpdsr4p4vf6.tbz.tar.bz2”,所以我必须检查。我可以将您的命令分配给变量name=${nameFile | sed's/\{7\}$/'}??