2016-07-01 2 views
1

У меня есть шаблон, который выглядит примерно так.Grep между двумя шаблонами в коде

var a ; 
var b; 

var obj = { 
aa : 'This is what I want' 
}; 

Я хочу, чтобы текст между aa : ' и '};

Там может быть несколько вхождений, но я хотел бы иметь первый.

Я пробовал awk, grep и sed. Но никто из них не дал мне идеального результата, но выплевывал весь код.

То, что я пытался до сих пор:

grep -Po "aa : \K.*(?= \'};)" 
sed -e 's/aa :\(.*\)\n};/\1/' 

ответ

0

Пожалуйста, попробуйте следующее:

awk 'BEGIN {Found = 0;} /^aa :/{Found = 1; } /^};/{Found = 0;} {if(Found) {print $0;}}' 
+0

нет выходных данных – user000111181

+0

Как вы его запускаете? – GMichael

+0

Я получаю: 'aa:« Это то, что я хочу »};' –

0

Использование grep -oP вы можете использовать матч сброса \K:

grep -oP "\baa\s*:\s*'\K[^']+" file 

This is what I want 
2
awk -F"'" -v RS=";" '/\naa/{print $2;exit}' 
+0

Это не работает. Добавьте строку между 'aa: 'Это то, что я хочу' и';} ', и попробуйте еще раз – GMichael

0

Если я действительно согнуть его в AWK:

BEGIN { 
    RS="- -it is not the spoon that bends, it is only yourself" 
    FS="(aa : '|'};)" 
} 
{ 
    print $2 
} 
0

С GNU AWK для мульти-гольцов RS:

$ awk -v RS="aa[[:space:]]*:[[:space:]]*'[^']*'[[:space:]]*}[[:space:]]*;" -F"'" '{$0=RT; print $2; exit}' file 
This is what I want 
0

Вот еще одно решение, используя sed:

echo $'var obj = {\naa: \'This is what I want\'\n}; 
var obj2 = {\naa: \'Unwanted\'\n};' | \ 
sed -ne $'/aa:/ {N;s/aa: \'\\(.*\\)\'\\n.*/\\1/;T;p;q}' 

T;p;q печатает замены на первое совпадение и завершение работы, и в дальнейшем продолжается следующая строка.

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