【課 題】
 引数に指定した複数のファイルの拡張子を「txt」に変更するスクリプトを作成しなさい。

【解 説】
 特定のルールに沿ってファイル名を変更したいときに,シェル・スクリプトは威力を発揮する。大量のファイルの一括処理に向くからだ。変換処理には,文字列処理を利用する。

 文字列の操作にはsedコマンドを利用する。sedはechoコマンドで表示された文字列をパイプで引き渡す必要がある。よって,今回の処理では,sedコマンドは,

echo 変換前文字列 | sed -e "s/置換条件/置換ルール/"

というように用いる。

 置換条件には正規表現を利用して拡張子を取り除くように条件を記述する。拡張子は必ずドット(.)以下の数文字で表される。また,拡張子自身にはドットは含まれない。拡張子を正規表現で表すと,「\.[^.]*」と記述できる。最初のドットの前の\(半角のバックスラッシュ)マークは,ドット記号が任意の1文字を表す機能を無効にするために付けている。また,[^.]はドット以外の文字を表す。最後の*は前の文字を利用した0文字以上の文字列を表す。よって[^.]*でドットを含まない文字列となる。

 拡張子はファイル名の最後に付けられるので,置換条件に文字列の最後を表す「$」を付加する。

 置換ルールは,置換条件にマッチした文字列を削除すればよいので何も記述しない。したがって,拡張子を取り除くには,次のように実行する。

echo $FN | sed -e "s/\.[^.]*$//"

コマンドの実行結果を変数に代入するには,バッククォートを利用する。そのため,拡張子を取り除いた文字列をnewfn関数に代入するには,次のように実行する。

newfn=`echo $FN | sed -e "s/\.[^.]*$//"`

 次に,拡張子を取り除いたファイル名に「.txt」拡張子を付加する。文字列をつなげるには変数の後につなげたい文字列を記述する。ただし,変数名と文字列が混ざらないように,変数名は{}でくくっておく。よって,新しいファイル名は,「${nfn}.txt」のようになる。

 最後に,元のファイル名(FN)から新しいファイル名(newfn)に変換する。

【解答例と練習問題は次ページ】