Puoi saltare grep e fallo in un unico awk :
xrandr | awk 'NF >= 3 && /[0-9]+x[0-9]+/ {sub(/[+-].*/, "", $3); print $3}'
1920x1200
1920x1200
primary
1029x1200
Singolo alternativo gnu grep soluzione:
xrandr | grep -oP 'connected\h+\K(\d+x\d+|\S+)'
Il (.*\d+x\d+)*^(?![\+]+\d\+\d) pattern corrisponde e cattura nel Gruppo 1 una sequenza facoltativa di zero o più caratteri diversi dai caratteri di interruzione di riga, il maggior numero possibile, quindi 1+ cifre, x , 1+ cifre, quindi richiede l'inizio della posizione della stringa (questo fa fallire sempre il modello! ) e si assicura che non ci siano uno o più + caratteri, una cifra, un + e una cifra immediatamente a destra della posizione corrente. Sembra uno schema molto corrotto che non corrisponde mai a nessuna stringa.
La tua logica può essere implementata come
xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'
Guarda la demo online e la demo regex.
Dettagli :
-oP- l'output corrisponde solo e abilita il motore regex PCRE\b\d+x\d+(?!(?:\+\d+\+)?\d):\b- confine di parola\d+- una o più cifrex- unx\d+- una o più cifre(?!(?:\+\d+\+)?\d)- un lookahead negativo che fallisce la corrispondenza se, immediatamente a destra della posizione corrente, c'è(?:\+\d+\+)?- una sequenza facoltativa di+, una o più cifre e+\d- una cifra.