【问题标题】:How to get last part of string in substring by variable number of delimiters如何通过可变数量的分隔符获取子字符串中字符串的最后一部分
【发布时间】:2019-03-29 09:35:30
【问题描述】:

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

这是因为我的字符串包含一个文件的名称,该文件可能会被压缩多次,因此具有超过 1 个点 (.)。 这些点将是我的分隔符,但由于供应商可能会在文件名中包含版本号(例如,software-v.3.2.4.tar.gz),我发现不应该切断最后一个后缀。

进度如下:

文件名保存在变量中。 文件第一次解压。 (去掉文件的 .gz 后缀) 现在我需要提取 .tar 存档。但我的命令仍将保留 .gz 后缀。命令将不起作用,因为文件不再具有后缀。

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

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

我还尝试使用文件的实际名称再次初始化 $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

...

感谢您的帮助。 问候

扬斯克

【问题讨论】:

标签: shell ksh


【解决方案1】:

不要使用| rev | cut -d'.' -f 1 | rev,而是使用| rev | cut -d'.' -f 2- | rev

【讨论】:

    【解决方案2】:

    Variable Substitution 是这里的最佳选择,因为它是内置的 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} - 与上面相同,但删除最长的匹配部分而不是最短的部分

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

    他们不能嵌套的限制。

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2012-05-19
      • 1970-01-01
      相关资源
      最近更新 更多