GNU/Linux >> Tutoriels Linux >  >> Linux

Extraire la sous-chaîne selon Regexp avec Sed ou Grep ?

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.


Linux
  1. Grep avec des opérateurs logiques ?

  2. Comment grep avec la sortie couleur

  3. Comment utiliser sed pour extraire la sous-chaîne

  4. Utilisation de sed pour diviser une chaîne avec un délimiteur

  5. sed insérer une ligne avec des espaces sur une ligne spécifique

Manipuler du texte avec sed et grep

Commande Grep sous Linux (avec exemples)

10 exemples pratiques de regex avec grep

Trouver une sous-chaîne dans des fichiers dans des sous-répertoires avec une seule commande intégrée ?

Remplir à zéro les nombres à 2 chiffres avec sed

Comment grep ps sortie avec des en-têtes