ええと、その正規表現でやっていることは、「文字列の末尾にあるファイル名拡張子(.XXXみたいなやつ)を取り除く」という処理ですね。
ただ、シェルスクリプトが提示されたサイトに載っている時点で間違っているので、まずは以下のように修正してください。=
の両側に空白があると、シェル変数への代入と見なされず、うまく動きません。それから、fが突然出てきますが、fileの書き間違いですね。
bash
1#!/bin/sh
2file=$1
3objfile=`echo $file | sed 's/.[^.]*$//'`
4
5g++ -g -o $objfile $file
6./$objfile
シェル変数fileには、シェルスクリプト実行時の最初のコマンドライン引数を$1
で取得して設定しており、提示されたサイトの流れでは、g++で処理したいファイル名が格納されます。
echoでそのファイル名を出力し、それをsedのsコマンドで一部を置換し、処理結果の文字列をコマンド置換でobjfileに格納します。
肝心のsedの処理ですが、「.
で始まり、.
以外の文字が(0文字以上)並んで、文字列末尾に至る」部分を見つけ、もしそれがあればその部分を空文字列に置換(つまりは削除)しています。例えば、「hogehoge.cpp」なら、「.cpp」の部分を取り除いて、「hogehoge」という文字列を生成しています。
.
は「文字通りの.(ドット、ピリオド)」を示すパターンですね。そのまま.
と書くと、正規表現では「任意の1文字」を示す特殊な記号(メタ文字)として扱われるので、.
と書く必要があります。
それに続く[^.]
は、「.以外の任意の文字」を示すパターンです。[^……]
は、内部に書いた文字を除いた任意の1文字にマッチします。なお、[]の内部では.
は「文字通りの.」を意味するので、提示したサイトのシェルスクリプトのように.
と書く必要はありません。.
と書いても同じ意味になりますけどね。
その直後の*
は、「直前のパターンの0回以上の繰り返し」を意味します。なお、0回というのは「一度も現われない」ことを示します。1回、2回、……はいいですよね。直前のパターンが[^.]
なので、[^.]*
が「.以外の任意の文字の0文字以上の繰り返し」を示すパターンになります。
最後の$
は、「文字列の終わり」という位置を示すパターンです(厳密には違うのですが、sedは行単位でしか正規表現を扱わないので詳細は省略)。
つまり、全体としては、「どこから始まっていてもいいが、.
で始まり、.
以外の文字が文字列の終わりまで並んでいたら、その.
を含めて末尾まで」がマッチします。
sedのsコマンドは、s/パターン/置換文字列/フラグ(省略可)
という形式で、パターンにマッチした部分を置換文字列に置き換えた文字列を出力します。今回は置換文字列が空文字列なので、パターンにマッチした部分が削除された文字列が生成されるわけです。