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.