Puncte:1

Într-o linie de text arbitrară, cum poate bash să extragă o valoare numită după un semn egal?

drapel ao

Această întrebare (Cum să obțineți valori după un semn egal) este practic ceea ce vreau:

Dată o linie de text, cu parametrul numit care arată ca sintaxa culoare=roșu, folosind bash cum puteți obține acea valoare a culorii (producând roșu)?

Cu excepția acestei întrebări, linia de text este în întregime acele perechi cheie-valoare, astfel încât răspunsul acceptat utilizează bash eval din moment ce acea sintaxă se întâmplă se potrivește foarte bine.


Mă întreb pentru o linie generică de text, cum ar fi â â³ Synaptics TM3289-021 id=13 ] cum aș putea obține acea valoare de identificare (producând 13)?

Poate folosind regex, unde știu că linia va conține [whitspace]id=<TEXTUL VREAU>[whitspace]?

bac0n avatar
drapel cn
`xinput list --id-only "Logitech USB Receiver Mouse"` puteți obține id-ul direct de la xinput.
Puncte:2
drapel it

Utilizare greplui -o (se scoate doar textul potrivit).Citit om grep si fa:

echo „grămadă de. text id=13 mai mult=4” | \
  grep -E -o 'id=[0-9]+`

Dacă doriți să fiți foarte atenți, potriviți și spațiile de început și de final:

echo „grămadă de. text id=13 mai mult=4” | \
  grep -E -o ' id=[0-9]+ '
tscizzle avatar
drapel ao
Minunat! Atunci cred că este destul de ușor să prindeți șirul rezultat începând după primele caractere (deoarece „id=" este de 3 caractere). Și voi căuta, de asemenea, cum să caut orice spațiu alb în jurul lui, nu doar spații (cazul meu are file cred).
bac0n avatar
drapel cn
@tscizzle dacă doriți toate numerele de la, de exemplu, id= puteți folosi lookbehind: `grep -Po '(?
terdon avatar
drapel cn
@tscizzle puteți folosi și expresii regulate compatibile cu Perl care au `\K` pentru "ignora orice a fost potrivit până în acest moment", ceea ce vă permite să faceți: `grep -oP 'id=\K[0-9]+`.
Puncte:1
drapel hr

Dacă vrei cu adevărat bash pentru a extrage valoarea, puteți folosi un regex cu =~ operator în interior [[ ... ]] suporturi de testare ex.:

$ re='\bid=([^[:blank:]]*)'
$ line='â â³ Synaptics TM3289-021 id=13 ]'
$ 
$ [[ $line =~ $re ]] && printf '%d\n' "${BASH_REMATCH[1]}"
13

Rețineți că am folosit \b (o limită a cuvântului) mai degrabă decât spațiul alb ca ancoră de început - care permite expresiei să se potrivească în cazul în care id=13 apare la începutul liniei, precum și la jumătatea drumului.

Dacă doriți să utilizați grep, vă sugerez să utilizați modul compatibil cu perl al lui GNU grep, astfel încât să puteți potrivi, dar să nu includeți id= porţiune:

$ printf „%s\n” „$line” | grep -Po '(?<=id=)\w*'
13

sau

$ printf „%s\n” „$line” | grep -Po 'id=\K\w*'
13

Aici, \w* se potrivește cu o secvență (posibil goală) de caractere de cuvinte - dacă doriți să potriviți numai ID-urile numerice, puteți modifica \w la \d.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.