将文件名减去扩展名存储在变量中

将文件名减去扩展名存储在变量中

文件:test.zip

Bash 脚本

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

变量中存储的值 = “test”

答案1

使用bash 参数扩展

zip_file="${filename}"
new_name="${zip_file%.*}"   
  • new_name将包含名称test,如果zip_filetest.zip

  • 如果zip_filetest.foo.zipnew_name就会有test.foo,如果只想test出于test.foo.zip使用:

    new_name="${zip_file%%.*}"
    

答案2

heemayl 仍然正确:例如:

full_path=/foo/bar/baz.zip
file_name="${full_path##*/}"
name="${file_name%.*}"

答案3

使用sed

zip_file="$(<<< "${filename}" sed -r 's/^(.*)\..*/\1/')"
  • zip_file="$( [...] )":将调用的子 shell 的以字符串形式分配stdout给变量zip_file
  • <<< "${filename}" [...]:将变量的内容以字符串形式重定向${filename}到调用的子 shellstdin
  • sed -r 's/^(.*)\./\1/': 使用扩展正则表达式编辑调用的子 shell 的内容stdin,通过匹配整个字符串并将其替换为与从开头到最后一个点的每个字符匹配的子字符串

编辑:看到您对 heemayl 的答案的评论,用匹配从最后一个斜杠到最后一个点的每个字符的子字符串进行替换:

zip_file="$(<<< "${filename}" sed -r 's/^.*\/(.*)\..*/\1/')"

相关内容