Comment faire pour commander “grep-oP” dans une ligne contenant des caractères spéciaux?

Comment puis-je créer une ligne contenant des caractères spéciaux?

comme par exemple j’ai un fichier contenant ce texte

ISA^G00^G ^G00^G ^G12^G14147844480 ^GZZ^G001165208 ^G160601^G1903^GU^G00401^G600038486^G0^GP^G>~GS^GTX^G14147844480^G001165208^G20160601^G1903^G600038486^GX^G004010VICS~ST^G864^G384860001~BMG^G00^G^G04~MIT^G000000591^GKohl's AS2 Certificate Change June 21, 2016~N1^GFR^GKOHL'S DEPARTMENT STORES~PER^GIC^[email protected]^GTE^G262-703-7334~MSG^GAttention Kohl's AS2 trading partners, Kohl's will be changing. 

Je voudrais grep la ligne sous le segment MSG

en utilisant cette commande:

grep-oP ‘MSG. \ K [\ w \ s \ d] *’ <nomfichier

Résultat attendu :

Les partenaires commerciaux AS2 de Kohl, Kohl, vont changer.

Résultat actuel:

Attention Kohl

Comment vais-je le faire?

Votre modèle:

 grep -Po 'MSG.\K[\w\s\d]*' 

correspond simplement à Attention Kohl parce que vous avez une seule citation après celle qui ne correspondra à aucun des jetons \w , \s , \d .

Vous avez aussi et . dans la partie désirée, vous devez donc également les assortir. De plus, \d est en fait un sous-ensemble de \w donc pas besoin d’explicite \d .

Donc, vous pouvez faire:

 grep -Po 'MSG.\K[\w\s,.'\'']*' 

Ou si vous voulez juste correspondre jusqu’à la fin:

 grep -Po 'MSG.\K.*' 

Voulez-vous simplement tout grep après MSG? Ce serait plus simple avec d’autres méthodes. Aussi, je vois qu’il y a plusieurs caractères ^G dans votre fichier, adjacents au mot MSG également. Vous ne savez pas si vous voulez exclure ceux qui sont en train de grimper.

Retour à votre regex donnée – vous pouvez append \W qui correspondra à un caractère non-mot et vous donner le résultat souhaité.

grep -oP 'MSG.\K[\w\s\d\W]*' filename

Pas besoin d’utiliser < operator pour grep ici.