Sie können grep
überspringen und erledigen Sie dies in einem einzigen awk
:
xrandr | awk 'NF >= 3 && /[0-9]+x[0-9]+/ {sub(/[+-].*/, "", $3); print $3}'
1920x1200
1920x1200
primary
1029x1200
Alternativ einfach gnu grep
Lösung:
xrandr | grep -oP 'connected\h+\K(\d+x\d+|\S+)'
Die (.*\d+x\d+)*^(?![\+]+\d\+\d)
Muster passt und erfasst in Gruppe 1 eine optionale Folge von null oder mehr Zeichen außer Zeilenumbruchzeichen, so viele wie möglich, dann 1+ Ziffern, x
, 1+ Ziffern und erfordert dann den Anfang der Zeichenfolgenposition (dadurch schlägt das Muster ständig fehl! ) und stellt sicher, dass es keinen oder mehrere +
gibt Zeichen, eine Ziffer, ein +
und eine Ziffer direkt rechts neben der aktuellen Position. Das sieht nach einem sehr beschädigten Muster aus, das niemals mit einer Zeichenfolge übereinstimmt.
Ihre Logik kann implementiert werden als
xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'
Sehen Sie sich die Online-Demo und die Regex-Demo an.
Einzelheiten :
-oP
- Nur Übereinstimmungen ausgeben und PCRE-Regex-Engine aktivieren\b\d+x\d+(?!(?:\+\d+\+)?\d)
:\b
- Wortgrenze\d+
- eine oder mehrere Ziffernx
- einx
\d+
- eine oder mehrere Ziffern(?!(?:\+\d+\+)?\d)
- ein negatives Lookahead, bei dem die Übereinstimmung fehlschlägt, wenn es unmittelbar rechts neben der aktuellen Position gibt(?:\+\d+\+)?
- eine optionale Folge von+
, eine oder mehrere Ziffern und+
\d
- eine Ziffer.