Bash:从文件名中删除多种模式

Bash:从文件名中删除多种模式

通常,循环遍历我用来basename提取文件名作为单独变量的文件:

# remove .pdb extension from filename in new variable and print name of the file without it
for pdb in "${storage}"/complex*.pdb ; do
pdb_name=$(basename "$pdb" .pdb)
echo this is "$pdb_name" without its extension!
done

如何使用相同的basename表达式从每个文件中删除多个模式?例如,除了“.pdb”之外,我还想省略“complex”,它始终出现在每个文件的开头(这里我使用它作为循环中识别文件的模式)。

答案1

据我所知,basename无法从路径的非目录部分删除前缀。我建议改用参数扩展功能:

shopt -s nullglob   # Don't loop over the pattern if it matches nothing
for pdb in "$storage"/complex*.pdb
do
  pdb_name=${pdb##*/complex}
  pdb_name=${pdb_name%.pdb}
  printf '%s\n' "$pdb_name"
done

${pdb##*/complex}pdb扩展为与已删除的 shell 模式匹配的最长前缀的值*/complex

${pdb_name%.pdb}pdb_name扩展为与删除的 shell 模式匹配的最短后缀的值.pdb

虽然这在您的情况下不是问题,但请注意,base_name=$(basename "$path")删除文件名末尾的换行符(由于命令替换)可能是不需要的副作用。 Shell 参数扩展在这方面更安全。

相关内容