0

ソース コードから情報を抽出して、他のユーザーが使用できる API を作成しようとしています。ファイルを grep して、共通のシグネチャを持つ変数のリストを取得することはできますが、一部の変数はポリモーフィックであるため、きれいに削除することはできません。

例えば:

public static Foo bar = new Foo(123, "Bar");
public static Foo baz = new Foo(222, "Baz");
public static FooBar fBar = new FooBar(135, "Foo", "Bar");
public static FooBaz fBaz = new FooBaz(256, "Baz", "Badger", "Baz");

次のように単純化したいと思います。

bar    123    Bar
baz    222    Baz
fBar   135    Bar
fBaz   256    Baz

現在、私はこれまでこれを行ってきました:

grep "public static Foo" file.java |  tr '(' ' ' | tr ')' ' ' | sed "s/public\ static\ //g"

これは私にこれを与えます:

Foo bar = new Foo 123, "Bar" ;
Foo baz = new Foo 222, "Baz" ;
FooBar fBar = new FooBar 135, "Foo", "Bar" ;
FooBaz fBaz = new FooBaz 256, "Baz", "Badger", "Baz" ;

でチェーンしようとするとsed "s/Foo*\ //g"、FooBar と FooBaz という単語が削除されません。どうすればこれを修正できますか?または、私がやりたいことを達成するためのよりエレガントな方法はありますか?

4

3 に答える 3

1

私は awk オンラインライナーを思いつきました:

awk -F'\\s*=[^(]*\\(|,\\s*"|"\\);' '{x=split($1,a," +"); print a[x], $2, $(NF-1)}' file

あなたの例で:

kent$  cat file
public static Foo bar = new Foo(123, "Bar");
public static Foo baz = new Foo(222, "Baz");
public static FooBar fBar = new FooBar(135, "Foo", "Bar");
public static FooBaz fBaz = new FooBaz(256, "Baz", "Badger", "Baz");

kent$  awk -F'\\s*=[^(]*\\(|,\\s*"|"\\);' '{x=split($1,a," +"); print a[x], $2, $(NF-1)}' file
bar 123 Bar
baz 222 Baz
fBar 135 Bar
fBaz 256 Baz
于 2013-05-02T16:39:22.927 に答える
0

次の sed スクリプトは、ジョブ全体を実行します。

sed -ne '/^public static/s/.* \([^ ][^ ]*\) *= *new *[^ (]* *(\([0-9]*\),.*"\([^"]*\)"[^"]*$/\1 \2 \3/p'
于 2013-05-02T16:37:29.220 に答える
0

あなたが探していると思います

sed 's/Foo[A-Za-z]*//g'

正規表現で*は、 は後置演算子であるため、Foo*一致のFo後に の 0 回以上の追加の繰り返しが続きますo

「何でも」.*と一致させるには、文字列の最後まで一致する追加の制約なしで使用します (ドット.は、改行を除く任意の 1 文字と一致する正規表現のメタ文字です)。

于 2013-05-02T16:31:55.603 に答える