作業中のメモ

よく「計算機」を使って作業をする.知らなかったことを中心にまとめるつもり.

bash における部分削除

bash を扱っていると,拡張子だけや,ファイル名だけなど文字列の一部を取り出したいことが多々ある.以前調べたが,また忘れてしまったので,ここにまとめておく.

コマンド 意味
${変数名#[パターン]} パターンに対応する最短接頭部を除去する
${変数名##[パターン]} パターンに対応する最長接頭部を除去する
${変数名%[パターン]} パターンに対応する最短接尾部を除去する
${変数名%%[パターン]} パターンに対応する最長接尾部を除去する

具体的な使い方を示しつつ,理解していく.まずは,以下のような文字列を考える.

#!/bin/bash

string=/sample/program/hoge/foo.f
string2=/sample/program/hogehoge/fileList.list.$$

ここから,ファイル名(拡張子あり)だけを取り出す方法を考える.このとき,「foo.f」,「fileList.list.$$」より左側は必要ないことが分かるので,先頭から「*/」までのうち,一番長い部分(最長接頭部)を削除すればよい.よって,

fileName=${string##*/}
fileName2=${string2##*/}

となる.同様な問題として,拡張子だけを取り出すことを考える.この場合,「.f」より左側は必要ないので,先頭から「*.」までのうち一番長い部分(最長接頭部)を削除すればよい.よって,

extension=${string##*.}

となる.string2 の方は,拡張子を「.list」としたいので,先ほど処理したファイル名から,「.$$」を削除すればよい.このとき,「.*」から末尾までのうち,もっとも短い部分(最短接尾部)を削除すればよい.よって,

extension2=${fileName2%.*}

となる.次に,絶対パスを含むファイル名(拡張子なし)を取り出すことを考える.このとき,「.f」,「.list.$$」の部分が必要ないことが分かるので,「.*」から末尾までのうち,もっとも長い部分(再調節尾部)を削除すればよい.よって,

pathFileName=${string%%.*}
pathFileName2=${string2%%.*}

となる.最後に,ファイル名(拡張子なし)だけ取り出すことを考える.この場合,絶対パスを含むファイル名(拡張子なし)から,ファイル名だけを取り出す方法を適応すればよい.よって,

fileNameWithoutExtension=${pathFileName##*/}
fileNameWithoutExtension2=${pathFileName2##*/}

となる.