2013-05-02 47 views
0

我试图从源代码中提取信息以创建一个API供其他人使用。我可以通过grep来获取具有共同特征的变量列表,但某些变量是多态的,所以我不能很好地清除它们。使用sed删除具有通用前缀的单词

例如:

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

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

你的榜样,你只需选择第一个和最后一个参数? – Kent 2013-05-02 16:30:33

回答

1

我想出了在衬里的AWK:用于构造

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 
+0

太棒了,这正是我需要的!谢谢! – 2013-05-02 16:47:15

0

我想象你正在寻找

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

在正则表达式,*的后缀操作符,所以Foo*比赛Fo随后的o零个或多个额外的重复。

要匹配“什么”,你会使用.*但没有附加约束,将匹配通过字符串的结尾(点.是一个正则表达式元字符相匹配任意一个字符,除了新行)。

+0

对!这是如何逃脱我的!我其实知道这种模式! :/ 谢谢! – 2013-05-02 16:47:49

0

下面的sed脚本将整个作业:

sed -ne '/^public static/s/.* \([^ ][^ ]*\) *= *new *[^ (]* *(\([0-9]*\),.*"\([^"]*\)"[^"]*$/\1 \2 \3/p' 
+0

似乎对我而言有点复杂,似乎对示例文件不起作用:X谢谢! – 2013-05-02 16:50:11

+0

对不起,有一双'\(\)'太多了。纠正。 – Uwe 2013-05-02 16:54:13