Я знаю, как удалить расширение файла, когда я его знаю как:
nameis=$(basename $dataset .csv)
но я хочу удалить любое расширение, не зная об этом заранее, кто-нибудь знает, как это сделать?
Любая помощь ценится, Тед
Я знаю, как удалить расширение файла, когда я его знаю как:
nameis=$(basename $dataset .csv)
но я хочу удалить любое расширение, не зная об этом заранее, кто-нибудь знает, как это сделать?
Любая помощь ценится, Тед
В bash вы можете сделать следующее:
nameis=${dataset%.*}
... например:
$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo
Этот синтаксис описан на странице bash man:
${параметр% слово}
${параметр %% слово}
Удалить шаблон суффикса. Слово расширяется для создания шаблона так же, как при расширении пути. Если шаблон совпадает с завершающей частью расширенного значения параметра, то результатом расширения является расширенное значение параметра с кратчайшим шаблоном соответствия (случай "%" ) или самый длинный шаблон соответствия (случай "%%" ) удалены. Если параметр равен @или *, операция удаления паттерна применяется поочередно по каждому позиционному параметру, а расширение - это результирующий список. Если параметр представляет собой переменную массива с индексом @или *, операция удаления шаблона применяется поочередно к каждому члену массива, а расширение - результирующий список.
Теперь, если вы хотите создать стильное старое школьное регулярное выражение:
echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/"
- > Возвращает: foo.bar.tar
I will break it down: s/ Substitute ^ From the beginning \( Mark .* Everything (greedy way) \) Stop Marking (the string marked goes to buffer 1) \. until a "." (which will be the last dot, because of the greedy selection) .* select everything (this is the extension that will be discarded) $ until the end / With (substitute) \1 The buffer 1 marked above (which is the filename before the last dot(.) / End
Криштиано Савино
Может возникнуть что-то вроде ${dataset%.*}
; остерегайтесь файлов без расширений, хотя, поскольку он будет искать точку, которая не является частью расширения, чтобы отрубить.
Вы можете удалить все после последней точки, если таковая имеется, с помощью sed
:
nameis=$(echo $filename | sed 's/\.[^.]*$//')
Но это не будет работать с файлами с двойными расширениями, такими как .tar.gz
.
nameis = ${набор данных %%. *} Предполагается, что ни один из ваших базовых имен не имеет точки. Это возвращает длинную до бесконечности строку слева.
Я бы предложил вместо basename
использовать команду sed
для этого, например:
echo "$fileName" | sed 's/\..*$//g'