我正在尝试从源代码中提取信息以创建供其他人使用的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这两个词。我怎么能纠正这个?或者有更优雅的方式来实现我想做的事情吗?
答案 0 :(得分:1)
我想出了一个awk on-liner:
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
答案 1 :(得分:0)
我想你正在寻找
sed 's/Foo[A-Za-z]*//g'
在正则表达式中,*
是一个后缀运算符,因此Foo*
与Fo
匹配,后跟o
的零次或多次重复。
要匹配“任何内容”,您将使用.*
但没有其他限制,将匹配字符串的结尾(点.
是一个正则表达式字符,它匹配除换行符之外的任何一个字符)。
答案 2 :(得分:0)
以下sed脚本完成整个工作:
sed -ne '/^public static/s/.* \([^ ][^ ]*\) *= *new *[^ (]* *(\([0-9]*\),.*"\([^"]*\)"[^"]*$/\1 \2 \3/p'