2016-05-30 13 views
2

Ich möchte das Jahr finden ETWAS passiert (das nächste Jahr Zeichenfolge Muster, vielleicht 2016y oder 16y oder 2016y1m3d, vor dem Schlüsselwort ETWAS) und markieren Sie es zum Beispiel ändernwie das erste Muster hinter einigen Muster in Regex

'2015y, Balabala; 2016y3m4d, passiert etwas

zu

‚2015y, balabala; <Marke> 2016y3m4d <Marke>, geschieht etwas, um etwas 'funktioniert nicht

einfach das Jahr und Schlüsselwort übereinstimmen', wie

echo '2015y, balabala; 2016y3m4d, SOMETHING happens' \ 
    | perl -ne 's/(\d+y\d+m\d+d|\d+y\d+m|\d+y)(.*)(SOMETHING)/<mark>\1<mark>\2\3/g; print;' 

ausgeben wird

<mark> 2015y <mark>, Balabala; 2016y, ETWAS passiert

Hilfe?

Antwort

1

Sie möchten, dass das Muster am nächsten zur Zeichenfolge SOMETHING ist. ein wenig Ihrer regex Ändern nur

echo '2015y, balabala; 2016y3m4d, SOMETHING happens' 
| perl -ne 's/(.*)\b(\d+y\d+m\d+d|\d+y\d+m|\d+y)\b(.*?)(SOMETHING)/\1<mark>\2<mark>\3\4/g; print;' 

oder

echo '2015y, balabala; 2016y3m4d, SOMETHING happens'  
| perl -ne 's/(.*)\b(\d+y\d+m\d+d|\d+y\d+m|\d+y)\b(.*?SOMETHING)/\1<mark>\2<mark>\3/g; print;' 
+0

gute Idee. Was ist, wenn ETWAS mehrmals auftritt, wie 2015y, Balabala; 2016y3m4d passiert ETWAS; 2015y, Balabala; 2016y3m4d, ETWAS passiert ' – user2548774

+0

@ user2548774 dann nur letzte '2016y3m4d, wird etwas geändert ... wollen Sie sie alle ändern? – rock321987

+0

@ user2548774 können Sie analysieren ** [hier] (https://regex101.com/r/zF5vZ7/1) ** – rock321987