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.