2016-07-01 11 views
1

Ich habe ein Muster, das in etwa so aussieht.Grep zwischen zwei Mustern in Code

var a ; 
var b; 

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

möchte ich den Text zwischen aa : ' und '};

Es könnte mehrere Vorkommen dieser sein, aber ich möchte den ersten haben.

Ich habe awk, grep und sed versucht. Aber keiner von ihnen gab mir das perfekte Ergebnis, sondern spuckte den gesamten Code aus.

Was ich bis jetzt versucht:

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

Antwort

0

Bitte versuchen Sie folgendes:

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

keine Ausgabe von diesem – user000111181

+0

Wie führen Sie es? – GMichael

+0

Ich bekomme: 'aa: 'Das ist was ich will'};' –

0

grep -oP können Sie in Übereinstimmung \K zurückgesetzt verwenden:

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

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

Es funktioniert nicht. Bitte füge eine Zeile zwischen 'aa: 'Das ist was ich will' und';} 'ein und versuche es erneut – GMichael

0

Wenn ich biegen Sie es in AWK wirklich:

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

Mit GNU awk für RS Multi-char:

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

Hier ist eine andere Lösung, mit 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 druckt den Austausch auf die erste Übereinstimmung und beendet, und fährt andernfalls mit der nächsten Zeile fort.

Verwandte Themen