Хранить имя файла в переменной минус расширение

3

Файл: test.zip

Сценарий Bash

while read filename; do
zip_file=${filename}
# do stuff    
done; 

Значение, сохраненное в переменной="test"

    
задан JohnnyBizzle 24.05.2015 в 16:00
источник

3 ответа

4

Используйте bash расширение параметра :

zip_file="${filename}"
new_name="${zip_file%.*}"   
  • new_name будет содержать имя test , если zip_file имеет test.zip

  • Если zip_file имеет test.foo.zip , new_name будет иметь test.foo , если вы хотите использовать только test из test.foo.zip :

    new_name="${zip_file%%.*}"
    
ответ дан heemayl 24.05.2015 в 16:05
источник
1

heemayl по-прежнему прав: пример:

full_path=/foo/bar/baz.zip
file_name="${full_path##*/}"
name="${file_name%.*}"
    
ответ дан Stephen 24.05.2015 в 17:00
0

Использование sed :

zip_file="$(<<< "${filename}" sed -r 's/^(.*)\..*//')"
  • zip_file="$( [...] )" : присваивает stdout вызываемой подоболочки переменной zip_file в виде строки
  • <<< "${filename}" [...] : перенаправляет содержимое переменной ${filename} в вызываемый подкласс stdin в виде строки
  • sed -r 's/^(.*)\.//' : редактирует содержимое вызываемого субблока stdin с использованием расширенных регулярных выражений, сопоставляя всю строку и заменяя ее подстрокой, соответствующей каждому символу с самого начала, до последней точки

Изменить : увидев ваш комментарий к ответу heemayl, замените подстрокой, соответствующей каждому символу от последней косой черты до последней точки:

zip_file="$(<<< "${filename}" sed -r 's/^.*\/(.*)\..*//')"
    
ответ дан kos 24.05.2015 в 17:25