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削除されたシェルパターンに一致する最も長いプレフィックスに拡張される値*/complex

${pdb_name%.pdb}pdb_name削除されたシェルパターンに一致する最も短いサフィックスに拡張される値.pdb

あなたの場合、これは問題ではありませんが、base_name=$(basename "$path")コマンドの置き換えのためにファイル名の末尾に改行文字を削除すると、望ましくない副作用が発生する可能性があることに注意してください。この点では、シェルパラメータの拡張がより安全です。

おすすめ記事