[Raspbian][Bash]Reguliere expressie tbv tekst midden in lijn

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 23-09 11:31
Ik loop een beetje vast met reguliere expressies in de Bash shell van Raspbian. Ik ben er sowieso al geen kei in en vind het dan ook al heel wat dat ik wel enigszins vooruit ben gekomen met goed zoeken via Google, lezen en uitproberen.

Wat ik graag wil doen is een bash scriptje schrijven die een overzicht geeft van de beschikbare resoluties die ik voor mijn RealVNC virtual desktop heb ingesteld, daar een resolutie uit kunnen kiezen en dan door het script laten instellen.

Dit is de output van xrandr in de virtual desktop sessie:
Bash:
1
2
3
4
5
6
7
8
9
 SZ:    Pixels          Physical       Refresh
*0   1280 x 720    ( 325mm x 183mm )  *0   
 1   1280 x 1024   ( 325mm x 260mm )   0   
 2   1024 x 768    ( 260mm x 195mm )   0   
 3    800 x 600    ( 203mm x 152mm )   0   
Current rotation - normal
Current reflection - none
Rotations possible - normal 
Reflections possible - none


Oorspronkelijk wilde ik eerst proberen de huidige ingestelde resolutie er uit te filteren. De ingestelde resolutie wordt gemarkeerd met een asterisk aan het begin en direct voor de refresh waarde.

Via Google was ik uitgekomen op https://www.linode.com/do...and-filter-text-with-grep die mij al een flinke stap voorwaarts hielp om de reguliere expressies wat beter te snappen en zelf te proberen reguliere expressies op te bouwen.

Eerst dacht ik dat ik een expressie op de hele regel moest toepassen:
Bash:
1
xrandr --current | grep -Eo "^\*[0-9]{1,2}[ ]+[0-9]+ x [0-9]+[ ]+\( [0-9m]+ x [0-9m]+ \)[ ]+\*[0-9]{1,3}"

Hoewel ik daarmee voor mij zelf bewees dan de juiste regel naar voren te krijgen was de output iets te veel:
Bash:
1
*0   1280 x 720    ( 325mm x 183mm )  *0


Ik ontdekte dat ik alle expressies na de resoluties weg kon laten om die gegevens niet in de output te krijgen. Dit werd toen de opdrachtregel / expressie:
Bash:
1
xrandr --current | grep -Eo "^\*[0-9]{1,2}[ ]+[0-9]+ x [0-9]+"

En daarmee kreeg ik dus:
Bash:
1
*0   1280 x 720

Al een stuk beter dus. :)

Maar ik wil graag alleen de resolutie van de regel die aanduid welke resolutie er staat ingesteld. En daar loop ik vast, want als ik ook de expressie vóór de resolutie weg haal:
Bash:
1
xrandr --current | grep -Eo "[0-9]+ x [0-9]+"

Dan krijg ik alle resoluties uit het lijstje ipv alleen de actieve:
Bash:
1
2
3
4
1280 x 720
1280 x 1024
1024 x 768
800 x 600

Dit komt toevallig ook wel erg van pas voor mijn script, maar is dus nog niet de oplossing om alleen de actieve resolutie weer te geven.

Ik zou dus minimaal alleen de actieve resolutie uit het lijstje in een variabele of array willen kunnen stoppen.
Hulp / uitleg hoe ik een array met de index-nummers en hun bijbehorende resoluties kan maken is ook erg welkom overigens, maar daar heb ik desnoods wel omweggetjes voor in gedachten.

Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 23-09 11:31
Het zit in je Tweakers bloed om maar te blijven proberen het zelf op te lossen he.
Inmiddels heb ik een voor mij zelf werkende oplossing om de actieve resolutie te verkrijgen door op de uitvoer van grep nogmaals grep toe te passen via een 2e pipe:
Bash:
1
xrandr --current | grep -Eo "^\*([0-9]{1,2}[ ]+)[0-9]+ x [0-9]+" | grep -Eo "[0-9]+ x [0-9]+"

Dan krijg ik wel netjes alleen de actieve resolutie:
Bash:
1
1280 x 720


Rest voor mij alleen nog de vraag of er een manier is om de index-nummers en bijbehorende resoluties in een array te krijgen.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Om met arrays te spelen kan je even kijken in Raspbian Dialog checklist output uit bestand naar array, daar doen we al het een en ander. :) Verder is Google je vriend, er is echt genoeg informatie hoe je arrays in bash maakt en aanroept. Succes!

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 23-09 11:31
Het gaat mij dan ook niet specifiek om de arrays. Dat heb ik inmiddels wel door. :)

Het gaat mij er dus om hoe ik èn een nummer (in dit geval een index nummer) èn een resolutie uit 1 en dezelfde regel kan extraheren om vervolgens in 1 of (meee waarschijnlijk, omdat Bash heb multidimensionale arrays ondersteunt) meerdere arrays te stoppen.

Ik ben nu wel zover dat ik de resolutie er uit kan extraheren en ik kan er wel een array van maken, maar stel dat de index-nummers van de output van xrandr door elkaar heen zouden (dat is niet zo, maar stel dat) staan dan wil ik ze toch geordend in mijn array kunnen krijgen op basis van die door elkaar heen geordende lijst in xrandr.

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 16:02
Waarom moet die index uit die regel komen? Volgens jouw voorbeeld lopen ze gewoon vanaf 1 omhoog, dus dan kan je iets doen als:
code:
1
2
3
4
5
a=1
for res in `xrandr --current | grep -Eo "[0-9]+ x [0-9]+"`; do
  resolution[$a] = $res
  a=$((a+1))
done

(geen idee hoe arrays in bash werken, dus neem de code niet TE letterlijk)