2017-01-02 5 views
1

Ich möchte einen regulären Ausdruck, der jedes Mal fängt +other so gut wie alles bis zum nächsten Komma.Regex, die ein Muster und alles danach erfasst, bis ein Zeichen erreicht ist

Mit

(word),+(other)(word),(code),(word),(other)(code),(example) 
(code),+(other),+(other)(code)(word)(example),(example),+(example) 
+(code),(other)(code)(word),(code),(word) 

Ich möchte

+(other)(word) 
+(other) 
+(other)(code)(word)(example) 

Mein Befehl zurückzukehren, die ich verwenden würde, so etwas wie egrep -o '\+\(other).*, aussieht. Das einzige Problem ist, dass das Komma in dieser Regex nicht unbedingt das nächste Komma ist. Im Augenblick gibt den Befehl

+(other)(word),(code),(word),(other)(code), 
+(other),+(other)(code)(word)(example),(example), 
+1

So versuchte 'egrep -o‚\ + \ (andere) [^,] *, 'noch? –

+0

Und ist das nicht die erwartete Ausgabe? Die Zeichenfolge von '+ (andere)' bis zum * ersten * Komma? Warum sollte '+ (anderes) (code) (Wort) (Beispiel) 'nicht übereinstimmen? Bitte aktualisieren Sie die Frage mit der Begründung. –

+0

Also, nach Ihrer Bearbeitung, sieht aus wie 'egrep -o' \ + \ (andere) [^,] * 'sollte genug sein? –

Antwort

1

Sie verbrauchen keine 0+ chars so viele wie möglich bis zum letzten (und einschließlich) , mit .*,.

Um zu vermeiden, , und nur passen bis zum ersten , passend, eine negierte Klammerausdruck [^,] verwenden und * quantifier für sie gelten:

egrep -o '\+\(other\)[^,]* 

Das [^,]* Muster passt auf alle 0+ andere Zeichen als ,.

+0

Danke! Ich habe noch einmal die Frage, die nicht in den obigen, wenn ich will, dass der Buchstabe p und ein - Symbol nach \ (andere \) aber vor dem nächsten Komma erscheinen, wie kann ich das übernehmen. Das ist alles woran ich gerade denken kann '\ + \ (andere \). * P. * \ -. * [^,] *' Aber wieder meine. * Fangen wieder alles ein – Jacob

+1

Es würde bedeuten, dasselbe "Tempering" zu verwenden "negierter Klammerausdruck:' \ + \ (anderes \) [^,] * p [^,] * - [^,] * '([demo] (https://regex101.com/r/syNSbc/1)) –

+0

Was genau ist [^,] *, weil es für mich so aussieht, als ob es eine beliebige Menge an Kommas am Anfang der Zeile bedeutet und es für mich keinen Sinn ergibt – Jacob

0

Wenn Ihre grep Perl kompatible reguläre Ausdrücke (PCRE) unterstützt, können Sie nicht gierigen Matching verwenden:

$ grep -Po '\+\(other\).*?,' infile 
+(other)(word), 
+(other), 
+(other)(code)(word)(example), 
Verwandte Themen