Sed / Grep - отфильтровать содержимое - PullRequest
2 голосов
/ 09 октября 2011

Учитывая, что у меня что-то вроде этого:

int val; struct node *mhm;
int val; struct node *next;

Я хочу извлечь содержимое в каждой строке, используя sed, awk или grep, чтобы они читали:

init->val = val; init->mhm = mhm;
init->val = val; init->next = next;

grep -o выводит каждый отдельный результат в новую строку, но мне нужно сохранить структуру строки (каждая группа переменных ссылается на отдельную вещь).

В настоящее время я использую команду gnu sed, но хочу тольковывести замененную строку:

sed -re 's/([A-Za-z0-9_]*);/init->\1 = \1;/g'

Эта команда sed выводит:

int init->val = val; struct node *init->mhm = mhm;
int init->val = val; struct node *init->next = next;

Даже при использовании не жадных модификаторов я не могу получить оператор регулярного выражения полной строки для успешного выбораимя каждой переменной в каждой строке.

Ответы [ 3 ]

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

Это работает для вашего набора образцов (незначительные изменения в вашем решении):

sed -re 's/[^;]* [*]?([A-Za-z0-9_]+) *;/init->\1 = \1; /g'
0 голосов
/ 09 октября 2011

попробуйте

awk '{for(i=1;i<=NF;i++) if($i~/;/){ gsub(/\*/,"",$i);a=gensub(/(\w*);/, "init->\\1 = \\1; ","g",$i);printf a;}print ""}' yourFile
0 голосов
/ 09 октября 2011

В каждой строке нет имени переменной, если вы не анализируете язык.

Это, как говорится, просто случайный текст, это:
s/([^\S\n]*)[^;\n]+?(\w+)\s*;/\1init->\2 = \2;/g
должен сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...