Vous pouvez ignorer grep
et faites-le en un seul awk
:
xrandr | awk 'NF >= 3 && /[0-9]+x[0-9]+/ {sub(/[+-].*/, "", $3); print $3}'
1920x1200
1920x1200
primary
1029x1200
Alternative unique gnu grep
solution :
xrandr | grep -oP 'connected\h+\K(\d+x\d+|\S+)'
Le (.*\d+x\d+)*^(?![\+]+\d\+\d)
le motif correspond et capture dans le groupe 1 une séquence facultative de zéro ou plusieurs caractères autres que les caractères de saut de ligne, autant que possible, puis 1+ chiffres, x
, 1+ chiffres, puis nécessite le début de la position de la chaîne (cela fait échouer le modèle tout le temps ! ) et s'assure qu'il n'y a pas un ou plusieurs +
caractères, un chiffre, un +
et un chiffre immédiatement à droite de l'emplacement actuel. Cela ressemble à un modèle très corrompu qui ne correspond à aucune chaîne.
Votre logique peut être implémentée comme
xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'
Voir la démo en ligne et la démo regex.
Détails :
-oP
- afficher uniquement les correspondances et activer le moteur de regex PCRE\b\d+x\d+(?!(?:\+\d+\+)?\d)
:\b
- limite de mot\d+
- un ou plusieurs chiffresx
- unx
\d+
- un ou plusieurs chiffres(?!(?:\+\d+\+)?\d)
- une anticipation négative qui échoue à la correspondance si, immédiatement à droite de l'emplacement actuel, il y a(?:\+\d+\+)?
- une séquence facultative de+
, un ou plusieurs chiffres et+
\d
- un chiffre.