メソッド シグネチャではなく、メソッドセレクターを抽出しようとしています。メソッド シグネチャには、戻り値の型と引数の型が含まれます。メソッド セレクターには、キーワードとコロンのみが含まれます。
非標準-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;
。