如何通过可变数量的分隔符获取子字符串中字符串的最后一部分

问题描述 投票:0回答:2

我有点挣扎。当我编写一个ksh脚本时,我需要提取一个字符串的子字符串,其中分隔符的出现次数是灵活的。

这是因为我的String保存了可能被压缩多次的文件的名称,因此具有多于1个点(。)。这些点将是我的分隔符,但由于供应商可能在文件名中包含版本号(例如software-v.3.2.4.tar.gz),我发现没有删除最后一个后缀。

进展情况如下:

文件名保存在变量中。文件首次解压缩。 (取.gz后缀远离文件)现在我需要提取.tar存档。但我的命令仍然是.gz后缀。命令不起作用,因为文件不再具有后缀。

如何获取变量的后缀。我无法保证分隔符的数量保持不变。

我尝试了几种组合转|凝乳'。' |转,但在这种情况下我只得到后缀。

我还尝试使用文件的实际名称再次初始化$ fileName变量,但因此我需要搜索整个目录。我尽力避免这种情况。

...

fileName="whole file name"
pathTo="path in which it should be moved after decompression"

if [ "$fileType" = "gz" ]; then

    gzip $pathTo$fileName -d $pathTo

    #Problem occurs right here

    tar xfv $pathTo$fileName -C $pathTo

else 
    echo "Unknown Filetype. Cannot decompress. Script stopped."
    exit

fi

...

我感谢任何帮助。电贺

Yonkske

shell ksh
2个回答
0
投票

不要使用| rev | cut -d'.' -f 1 | rev但使用| rev | cut -d'.' -f 2- | rev


0
投票

变量替换是这里最好的选择,因为它是一个内置的shell也是最快的。

filename='software-v.3.2.4.tar.gz'
echo ${filename##*.}

输出将是gz

这不会修改变量$ filename的值。

if [[ "${filename##*.}" == "gz" ]]; then

它是如何工作的,

${var#pattern} - 删除与左侧模式匹配的文本后使用var的值

${var##pattern} - 与上面相同,但删除最长的匹配件而不是最短的匹配件

${var%pattern} - 删除与右侧模式匹配的文本后使用var的值

${var%%pattern} - 与上面相同,但删除最长的匹配件而不是最短的匹配件

还有更多,但这是相关的。

这个限制他们不能嵌套。

© www.soinside.com 2019 - 2024. All rights reserved.