Обнаружение и объединение многострочной структуры с использованием sed - PullRequest
2 голосов
/ 08 октября 2011

Итак, учитывая, что у меня есть некоторый тип структуры данных в сегменте кода:

struct apple {
    int type, color;
    Apple app;
};

// ... more code

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

struct apple { int type, color; Apple app; };

).

Это часть домашнего задания.Я только что выучил sed на лекции примерно неделю назад, и я очень не уверен, как сделать что-то подобное.Поэтому, если вам неудобно отвечать прямо, я был бы признателен, если бы вы указали мне правильное направление, чтобы я мог научиться правильно использовать эту утилиту.

Я предполагаю, что можно что-то сделатьс помощью sed путем определения определения структуры, а затем продолжения чтения каждой строки в глобальный буфер до тех пор, пока не будет найдено} (я предполагаю, что в определении структуры нет объединений или чего-либо еще).Кажется, что в этой программе много силы, и я не могу найти в ней хороших введений.

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Я бы сделал что-нибудь в строке этого:

$ sed -n '/struct/,/};/p' input | sed -e ':a;N;$!ba;s/\n//g'
struct apple {    int type, color;    Apple app;};

Конструкция /foo/,/bar/ выбирает все линии (включительно) между шаблонами.

Команда N добавляет новую строку и следующую строку к текущему шаблону. Затем исполняется знаменитая команда s///, которая заменяет символ новой строки ничем, то есть соединением строк.

1 голос
/ 08 октября 2011

может быть лучший способ решить эту проблему, например awk, может быть, с tr.Однако, поскольку вы упомянули, что это домашнее задание, и оно должно быть выполнено sed, я написал следующие команды (одна строка: D).Обратите внимание, есть две «седь» команды.надеюсь, что это может быть принято.

команда для решения проблемы:

sed -rn '/^struct/{x;s/.*/#/g;x;p;n}; 
    /\};/ {x;/#/{s/#//;x;p;n}};
    x; /#/{x;p}' yourFile | sed -r ':a;N; s/\n//g;s/\};/&\n/g; ba;' 

Теперь давайте проведем тест, я создал файл с именем tc и просмотрите содержимое:

kent$  cat t.c
struct apple1 {
    int type, color;
    Apple app;
};

// ... more code
// ... more code
// ... more code
// ... more code
function abc(para){
 foo;
 bar;
 return ;
}
struct apple2 {
    int type, color;
    Apple app;
};

// ... more code
// ... more code
// ... more code 
struct apple3 {
    int type, color;
    Apple app;
};

// ... more code

Теперь играйте в мои команды sed с tc baby:

kent$  sed -rn '/^struct/{x;s/.*/#/g;x;p;n}; 
        /\};/ {x;/#/{s/#//;x;p;n}};
        x; /#/{x;p}' t.c | sed -r ':a;N; s/\n//g;s/\};/&\n/g; ba;' 

struct apple1 {    int type, color;    Apple app;};
struct apple2 {    int type, color;    Apple app;};
struct apple3 {    int type, color;    Apple app;};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...