3

Objective-C メソッド宣言をセレクターNSStringに変換しています。つまり、このメソッドのようにパラメーター名と型を削除しています。

- (void)getCString:(char *)buffer maxLength:(NSUInteger)maxLength

取得するため

getCString:maxLength:

したがって、正規表現が必要なものを抽出することがわかりました( http://gskinner.com/RegExr/\w*?\:のようなオンライン正規表現チェッカーで正常に動作します)が、 (OS Xで)動作することはできません正規表現を使用して署名を抽出します。sed

さまざまな sed スニペット/サンプル ページから、このようなものが機能するはずであるという印象を受けましたが、そうではありません (私が試した ~250 のバリエーションも...):

 cat test.m | sed '/\w*?\:/p'

どんなsed魔法使いでも手を差し伸べることができますか?

4

4 に答える 4

6

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

非標準-Eフラグを使用して、POSIX 拡張正規表現を使用するように sed に指示できます。

これはあなたが望むことをするかもしれません:

sed -E -n '/^[-+]/{
    s/^.[[:blank:]]*(\([^)]*\))?[[:blank:]]*//
    s/[[:blank:]]*[;{][[:blank:]]*$//
    s/:[^:]*([[:blank:]]|$)/:/g
    p
}' test.m

これは初心者にとってかなり複雑な sed コマンドなので、分解してみましょう。

  1. この-Eフラグは、Mac OS X などの FreeBSD 派生物で拡張正規表現を有効にします。

  2. この-nフラグは、すべての入力行を自動的に出力しないように sed に指示します。

  3. /^[-+]/-(インスタンス メソッドの場合) または+(クラス メソッドの場合)で始まるすべての行を選択します。

  4. {選択した各行ですべて実行される sed コマンドのグループを開始します。グループは一致する で終了し}ます。

  5. s/^.[[:blank:]]*(\([^)]*\))?[[:blank:]]*//-orを削除し+、その後に任意の量の空白、その後にメソッドの戻り値の型、任意の量の空白が続きます。a の(後に任意の数の非)文字が続き、その後に). 戻り値の型は実際にはオプションであることに注意してください。宣言されたメソッド- foo:(int)x;は完全に有効です (デフォルトの戻り値の型は ですid)。また、メソッドの戻り値の型が のような明示的な関数ポインターまたはブロックである場合、この正規表現は正しく機能しないことに注意してください。これは- (void (^)(void))getBlock;、正規表現でネストされた括弧を処理できないためです。

  6. s/[[:blank:]]*[;{][[:blank:]]*$//;または{、および周囲の空白を行末から削除します。これは、次のコマンドを正しく機能させるために重要です。

  7. 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;

于 2013-04-04T20:57:55.147 に答える
1

を使用してこれを試してください:

$ echo '- (void)getCString:(char *)buffer maxLength:(NSUInteger)maxLength ' |
perl -lne '/^\s*-\s*\(\w+\)\s*(\w+:)\([^\)]+\)\w+\s+(\w+:)/ && print $1, $2'
getCString:maxLength:
于 2013-04-04T18:51:28.763 に答える
0
$ awk -F'[() ]' '{print $4 $8}' file
getCString:maxLength:

$ cat file
- (void)getCString:(char *)buffer maxLength:(NSUInteger)maxLength
于 2013-04-04T21:19:34.090 に答える