bashで指定のファイルの関数の定義一覧を表示する

一見難しそうに見えるが、結構簡単。

前提として関数は以下のルールで書かれているとする。

  1. functionというキーワードは行の先頭にあり、functionの前には半角スペース等余分なものはない。
  2. function 関数名() {という形式で必ず、{と関数名は同じ行にある。
  3. 関数の終わりをさす、}は必ず、行の先頭にあり、}の後には必ず、改行が入る。
  4. 関数内の{と}は行の先頭にない。(普通にインデントを入れていたら、自然とそうなります。)
  5. function 関数名 () {の間の半角スペースは何個あっても動くようにする。ただし、function 関数名の間には一個だけ半角スペースが入っているとする。

2についてはfunctionキーワード,if文の次の行に「{」を書く形式のものもあるが、
そうすると、検索、置換を行うのが難しくなる。
(bash、正規表現等は行どうし、行またぎの処理が苦手のため。)

$ cat bin/myfunction | grep "^function .\+ *() *{$"

関数名が何かわからないのでそこを.\+
としている。
これで
function 名前 {} *{
という形式で表示される。

ここから関数名だけ取ると良いので、
下のようになる。

 $ cat bin/myfunction | grep "^function .\+ *() *{$" | sed 's/function //' | sed 's/().*$//'


functionキーワードと関数名の間に必ず、
半角スペースがあるので、
functionキーワードと一緒に半角スペースを削除する。
次に、関数名の後に直接(){がついている場合もあるのでその場合は
sedで削除する。

関数が定義されている
行番号も一緒に出力したい場合は下のようになる。

$ cat bin/myfunction | grep -n "^function .\+ *() *{$" | sed 's/:function /:/' | sed 's/().*$//'

grep -n で行番号付きで表示できるので、

これでファイルに定義されている関数名一覧が取得できるはずだ。

これを関数としてまとめる
function funclist () {
    if [ -z $1 ]; then


        return

     fi

     local filename=$1

     if test ! '-n' = $2 || [ -z $2 ]; then
        cat $1 | grep  "^function .\+ *() *{$" | sed 's/function //' | sed 's/().*$//'

     else
        cat $1 | grep -n "^function .\+ *() *{$" | sed 's/:function /:/' | sed 's/().*$//'
    fi
}

これで、
$ funclist 関数が書かれているファイル -n (-nはオプション)

で関数一覧を表示させることができる。


また、このスクリプトは
他のプログラミング言語に対しても
多少変える程度で正しく動く。

()にエスケープが必要なのと、
+にエスケープがいらなくなるので
その修正が必要になる。


コメント

人気の投稿