2013-05-02 2 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

для конструктора , вы просто выбираете первый и последний параметр? – Kent

ответ

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

Удивительный, это именно то, что мне нужно! Спасибо! –

0

Я полагаю, вы ищете

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

В регулярных выражениях, * постфиксный оператор, так Foo* матчи Fo следуют ноль или более дополнительных повторений o.

Для соответствия «ничего», вы должны использовать .*, но без дополнительных ограничений, которые будут соответствовать концу строки (точка . является метасимволом регулярного выражения, который соответствует любому символу, кроме новой строки).

+0

Правильно! Как это спасло меня! Я действительно знаю эту картину! :/ Благодаря! –

0

Следующая СЕПГ скрипт делает всю работу:

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

Кажется немного сложным для меня и, похоже, не работает против файла примера: X Спасибо в любом случае! –

+0

Извините, была одна пара '\ (\)' слишком много. Исправленный. – Uwe