Dans un environnement UNIX (BSD), je souhaite capturer une sous-chaîne spécifique à l'aide d'une expression régulière.
Supposons que le dmesg la sortie de la commande inclurait la ligne suivante :
pass2: <Marvell Console 1.01> Removable Processor SCSI device
Je voudrais capturer le texte entre le < et > caractères, comme
dmesg | <sed command>
devrait afficher :
Marvell Console 1.01
Cependant, il ne devrait rien afficher si la regex ne correspond pas. De nombreuses solutions dont sed -e 's/$regex/1/ affichera toute l'entrée si aucune correspondance n'est trouvée, ce qui n'est pas ce que je veux.
L'expression régulière correspondante pourrait être :regex="^pass2: <(.*)>"
Comment puis-je faire correctement une correspondance regex en utilisant sed ou grep ? Notez que le grep -P l'option n'est pas disponible dans ma distribution BSD UNIX. Le sed -E option est disponible, cependant.
Réponse acceptée :
Essayez ceci,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Ou POSIXly (-E n'a pas encore atteint la norme POSIX en 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Sortie :
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
Cela n'imprimera que la dernière occurrence de <...> pour chaque ligne.