2013-03-07 1 views
1

Eclipse «Генерировать объекты из таблиц ...» Генератор кода JPA настаивает на создании поля @Id и связанных методов getter/setter, несмотря на то, что они определены в надкласс, который я обозначаю в шагах мастера.Удаление нескольких строк из файлов с помощью sed/awk с использованием шаблона регулярного выражения

Чтобы обойти это, моя идея - написать скрипт, чтобы удалить нарушающие строки и очистить созданные файлы другими способами. (Да, я мог бы сделать это вручную, используя диалог «Найти/заменить» в Eclipse, но я хочу автоматизировать весь набор изменений, потому что я буду выполнять эту процедуру генерации кода/очистки вручную несколько раз, работая на разных моделях.)

Проблема заключается в том, что я не могу найти правильный шаблон регулярного выражения для сопоставления нескольких строк для использования в awk или sed. Образцы регулярных выражений, которые я создаю, работают в диалоговых окнах поиска Eclipse и TextWrangler, но не с awk или sed.

Вот многострочные фрагменты текста на которые я хочу, чтобы удалить (в отдельных звонков в AWK/SED, конечно):

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(unique=true, nullable=false) 
private String id; 

и

public String getId() { 
    return this.id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

Пожалуйста, обратите внимание, что каждая непустая строка в приведенном выше коде начинается с символа \ t, даже если его нет, когда вставлен здесь.

В качестве примера, чтобы удалить геттер/сеттер строки, я попытался

awk '!/\tpublic String getId\(\) \{\r\t\treturn this\.id;\r\t\}\r\r\tpublic void setId\(String id\) \{\r\t\tthis\.id = id;\r\t\}\r/' $file > temp.txt && mv temp.txt $file 

или сокращенный вариант

awk '!/^\tpublic String getId.*\r.*\r.*\r\r.*\r.*\r.*\r\r/' ... 

, но не работают.

(Обе модели работают в Eclipse, или TextWrangler найти строки, которые будут удалены.)

я могу получить только одну строку удаляет, например

awk '!/^\tpublic String getId.*\r/' ... 

, но это не помогает, так как удаление " \ t} \ r "удалит все фигурные скобки, заканчивающиеся в конце концов и заканчивающиеся на класс.

Я делаю это на Mac под управлением OS X 10.8.2, если это имеет значение.

Спасибо.

ответ

3

По умолчанию awk и sed - это инструменты на основе строк, поэтому вы не можете сопоставлять более чем с одной строкой.

Я хотел бы предложить, идентифицирующий диапазон, используя регулярное выражение для первой линии и смещение до последней строки, например:

sed -e '/^\tpublic String getId/,+2 d' 

Это удаляет строку public String getId, и две следующие строки.

+1

Спасибо за попытку, но вот что я получаю за сообщение об ошибке: 'sed: 1:"/^ \ tpublic String getId ... ": ожидаемый контекстный адрес' и' sed: 1: "/ @ Id /, +4 d ": ожидаемый контекстный адрес' для 'sed -e '/^\ tpublic String getId /, + 2 d' $ file' и' sed -e "/ @ Id /, + 4 d" $ file' Это возможно, что это связано с версией sed на OS X 10.8.3? – pfurbacher

+0

Да, я думаю, что +2 - расширение GNU.Вы также можете попробовать совместить конечную строку с регулярным выражением: '/ regex1 /,/regex2 /'. – Andy

+0

Спасибо, я наткнулся на ту же информацию (версия GNU) после добавления комментария. Действительно, используя два адреса (два шаблона регулярных выражений), как вы предлагаете, делает трюк в версии BSD на OS X. (Оказывается, ожидая некоторых предложений здесь, я написал Applescript, который делает массивы файлов - он использует замену TextWrangler функция с шаблонами регулярных выражений в моем первоначальном вопросе выше. Это тоже отлично работает.) – pfurbacher

Смежные вопросы