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 's/Foo[A-Za-z]*//g'

在正则表达式中,*是一个后缀运算符,因此Foo*匹配Fo后跟零个或多个附加重复o.

要匹配“任何内容”,您可以使用.*但没有额外的约束,它将匹配到字符串的末尾(点.是匹配除换行符之外的任何一个字符的正则表达式元字符)。

于 2013-05-02T16:31:55.603 回答
0

以下 sed 脚本完成了整个工作:

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