使用sed删除具有公共前缀的单词

时间:2013-05-02 16:27:20

标签: regex bash sed awk

我正在尝试从源代码中提取信息以创建供其他人使用的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这两个词。我怎么能纠正这个?或者有更优雅的方式来实现我想做的事情吗?

3 个答案:

答案 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'