Sed / Grep — отфильтровывает содержимое

#regex #unix #sed

#регулярное выражение #unix #sed

Вопрос:

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

 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;
  

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

Ответ №1:

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

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

Ответ №2:

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

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

Ответ №3:

попробуйте это

 awk '{for(i=1;i<=NF;i  ) if($i~/;/){ gsub(/*/,"",$i);a=gensub(/(w*);/, "init->\1 = \1; ","g",$i);printf a;}print ""}' yourFile