bashで指定のファイルの関数の定義一覧を表示する
一見難しそうに見えるが、結構簡単。
前提として関数は以下のルールで書かれているとする。
2についてはfunctionキーワード,if文の次の行に「{」を書く形式のものもあるが、
そうすると、検索、置換を行うのが難しくなる。
(bash、正規表現等は行どうし、行またぎの処理が苦手のため。)
$ cat bin/myfunction | grep "^function .\+ *() *{$"
関数名が何かわからないのでそこを.\+
としている。
これで
function 名前 {} *{
という形式で表示される。
ここから関数名だけ取ると良いので、
下のようになる。
$ cat bin/myfunction | grep "^function .\+ *() *{$" | sed 's/function //' | sed 's/().*$//'
functionキーワードと一緒に半角スペースを削除する。
次に、関数名の後に直接(){がついている場合もあるのでその場合は
sedで削除する。
関数が定義されている
行番号も一緒に出力したい場合は下のようになる。
$ cat bin/myfunction | grep -n "^function .\+ *() *{$" | sed 's/:function /:/' | sed 's/().*$//'
grep -n で行番号付きで表示できるので、
これでファイルに定義されている関数名一覧が取得できるはずだ。
これを関数としてまとめる
function funclist () {
if [ -z $1 ]; then
else
cat $1 | grep -n "^function .\+ *() *{$" | sed 's/:function /:/' | sed 's/().*$//'
fi
}
これで、
$ funclist 関数が書かれているファイル -n (-nはオプション)
で関数一覧を表示させることができる。
また、このスクリプトは
他のプログラミング言語に対しても
多少変える程度で正しく動く。
()にエスケープが必要なのと、
+にエスケープがいらなくなるので
その修正が必要になる。
前提として関数は以下のルールで書かれているとする。
- functionというキーワードは行の先頭にあり、functionの前には半角スペース等余分なものはない。
- function 関数名() {という形式で必ず、{と関数名は同じ行にある。
- 関数の終わりをさす、}は必ず、行の先頭にあり、}の後には必ず、改行が入る。
- 関数内の{と}は行の先頭にない。(普通にインデントを入れていたら、自然とそうなります。)
- function 関数名 () {の間の半角スペースは何個あっても動くようにする。ただし、function 関数名の間には一個だけ半角スペースが入っているとする。
そうすると、検索、置換を行うのが難しくなる。
(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はオプション)
で関数一覧を表示させることができる。
また、このスクリプトは
他のプログラミング言語に対しても
多少変える程度で正しく動く。
()にエスケープが必要なのと、
+にエスケープがいらなくなるので
その修正が必要になる。
コメント
コメントを投稿