Como retornar apenas dois números após a correspondência de regex com grep ou sed?

Como retornar apenas dois números após a correspondência de regex com grep ou sed?

Estou escrevendo um script de shell para ser executado na inicialização que desativa meu nó de rastreamento que está funcionando mal. Eu começo com xinput list, que eu canalizo para grep Stickalgo assim grep id=que me dá os dois números, geralmente 11. os números estão entre 1 e 18, pelo que posso dizer, mas preciso escrever algo como foo=xinput list | grep Stick | grep id=e conjuntos foo para 11. aqui está o exemplo da lista xinput:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Power Button                              id=6    [slave  keyboard (3)]
↳ Video Bus                                 id=7    [slave  keyboard (3)]
↳ Power Button                              id=8    [slave  keyboard (3)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

O que preciso obter é o número logo após id= na linha Stick, 11.

Responder1

Resumindo, aqui está o comando que você deseja:

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

Segue uma explicação mais detalhada.


Você deve ser capaz de fazer o que quiser com grepuma expressão regular que inclua umafirmação de olhar para trás. O ingrediente principal é a seguinte grepexpressão:

grep -Po '(?<=id=)\d\d?'

Isso corresponderá às substrings que começam id=e são seguidas por um ou dois dígitos, mas retornará apenas os dígitos e não o id=prefixo.

Aqui está como você pode testar isso:

echo "id=11" | grep -Po '(?<=id=)\d\d?'

Isso produz 11como saída. Aplicar isso ao seu snippet de código resulta no seguinte:

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

Como segundo teste, suponha que colocamos seus dados de exemplo no arquivo data.txt:

# data.txt
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Power Button                              id=6    [slave  keyboard (3)]
↳ Video Bus                                 id=7    [slave  keyboard (3)]
↳ Power Button                              id=8    [slave  keyboard (3)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

Em seguida, execute o seguinte comando:

cat data.txt | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?'

Isso produz 11como saída.

Responder2

Especifique AlpsPS/2 ALPS DualPoint Stickpara xinput

Ao especificar o nome do dispositivo, se conhecido, xinputsomente --listaquele dispositivo, ao qual você pode restringir --id-only:

O comando:

xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'

retornará o valor do ID do dispositivo especificado:

11

informação relacionada