#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