メソッド シグネチャではなく、メソッドセレクターを抽出しようとしています。メソッド シグネチャには、戻り値の型と引数の型が含まれます。メソッド セレクターには、キーワードとコロンのみが含まれます。
非標準-Eフラグを使用して、POSIX 拡張正規表現を使用するように sed に指示できます。
これはあなたが望むことをするかもしれません:
sed -E -n '/^[-+]/{
s/^.[[:blank:]]*(\([^)]*\))?[[:blank:]]*//
s/[[:blank:]]*[;{][[:blank:]]*$//
s/:[^:]*([[:blank:]]|$)/:/g
p
}' test.m
これは初心者にとってかなり複雑な sed コマンドなので、分解してみましょう。
この-Eフラグは、Mac OS X などの FreeBSD 派生物で拡張正規表現を有効にします。
この-nフラグは、すべての入力行を自動的に出力しないように sed に指示します。
/^[-+]/-(インスタンス メソッドの場合) または+(クラス メソッドの場合)で始まるすべての行を選択します。
{選択した各行ですべて実行される sed コマンドのグループを開始します。グループは一致する で終了し}ます。
s/^.[[:blank:]]*(\([^)]*\))?[[:blank:]]*//-orを削除し+、その後に任意の量の空白、その後にメソッドの戻り値の型、任意の量の空白が続きます。a の(後に任意の数の非)文字が続き、その後に). 戻り値の型は実際にはオプションであることに注意してください。宣言されたメソッド- foo:(int)x;は完全に有効です (デフォルトの戻り値の型は ですid)。また、メソッドの戻り値の型が のような明示的な関数ポインターまたはブロックである場合、この正規表現は正しく機能しないことに注意してください。これは- (void (^)(void))getBlock;、正規表現でネストされた括弧を処理できないためです。
s/[[:blank:]]*[;{][[:blank:]]*$//;または{、および周囲の空白を行末から削除します。これは、次のコマンドを正しく機能させるために重要です。
s/:[^:]*([[:blank:]]|$)/:/gは、コロンの後にできるだけ多くの非:文字が続き、その後に空白または行末が続くものに一致し、一致したものをコロンだけに置き換えます。末尾のgフラグは、行のすべての一致に対してこれを行うように sed に指示します。このコマンドは、引数の型と名前を削除します。このコマンドは、戻り値の型を削除するコマンドとは異なり、ネストされた括弧を適切に処理することに注意してください。また、引数の型もオプションであることに注意してください。- foo:bar引数を 1 つ取るメソッドです (その型のデフォルトはidです)。
例:
:; echo '- (void)getCString:(char *)buffer maxLength:(NSUInteger)maxLength' | sed -E -n '/^[-+]/{
s/^.[[:blank:]]*(\([^)]*\))?[[:blank:]]*//
s/[[:blank:]]*[;{][[:blank:]]*$//
s/:[^:]*([[:blank:]]|$)/:/g
p
}'
getCString:maxLength:
この sed コマンドは、 などの引数のないメソッドでも機能することに注意してください- (void)save;。