Как получить последнюю часть строки в подстроке по переменному количеству разделителей - PullRequest
0 голосов
/ 29 марта 2019

Я немного борюсь. Когда я пишу сценарий ksh, мне нужно извлечь Подстроку Строки, в которой число вхождений ограничителя является гибким.

Это так, поскольку моя строка содержит имя файла, который может быть сжат несколько раз, поэтому имеет более 1 точки (.). Эти точки будут моим разделителем, но, поскольку поставщик может включать номера версий в имя файла (например, software-v.3.2.4.tar.gz), я не вижу, чтобы было обрезать последний суффикс.

Прогресс выглядит следующим образом:

Имя файла сохраняется в переменной. Файл распаковывается в первый раз. (убирая суффикс .gz из файла) Теперь мне нужно извлечь архив .tar. Но моя команда все еще будет содержать суффикс .gz. Команда не будет работать, так как файл больше не имеет суффикса.

Как мне получить суффикс моей переменной. Я не могу гарантировать, что количество разделителей останется прежним.

Я пробовал несколько комбинаций | рев | cur -d '.' | 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

...

Я благодарен за любую помощь. Поздравил

Yonkske

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Подстановка переменных - лучший выбор здесь, поскольку это встроенная оболочка, также самая быстрая.

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} - То же, что и выше, но удалить самую длинную подходящую фигуру вместо самой короткой

Здесь есть и другие, но это релевантные.

Ограничение этого: они не могут быть вложенными.

0 голосов
/ 30 марта 2019

Не используйте | rev | cut -d'.' -f 1 | rev, но используйте | rev | cut -d'.' -f 2- | rev

...