¿Cómo devolver dos números después de una coincidencia de expresiones regulares con grep o sed?

¿Cómo devolver dos números después de una coincidencia de expresiones regulares con grep o sed?

Estoy escribiendo un script de shell para ejecutarlo al inicio que deshabilita mi punto de seguimiento que ha estado funcionando mal. Empiezo con xinput list, que canalizo a grep Sticklo que necesito canalizar a algo así grep id=que me da los dos números, generalmente 11. Los números están entre 1 y 18, por lo que puedo decir, pero necesito escribir algo como foo=xinput list | grep Stick | grep id=y establece foo a 11. aquí está la lista de entrada de ejemplo:

⎡ 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)]

Lo que necesito obtener es el número justo después de id= en la línea Stick, 11.

Respuesta1

En pocas palabras, aquí está el comando que desea:

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

Sigue una explicación más detallada.


Deberías poder hacer lo que quieras con grepuna expresión regular que incluya unafirmación de mirar hacia atrás. El ingrediente clave es la siguiente grepexpresión:

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

Esto coincidirá con las subcadenas que comienzan con id=uno o dos dígitos y van seguidas de uno o dos, pero devolverá solo los dígitos y no el id=prefijo.

Así es como puedes probar esto:

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

Esto produce 11como resultado. Al aplicar esto a su fragmento de código se obtiene lo siguiente:

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

Como segunda prueba, supongamos que colocamos los datos de ejemplo en el archivo 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)]

Luego ejecute el siguiente comando:

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

Esto produce 11como resultado.

Respuesta2

Especificar AlpsPS/2 ALPS DualPoint Stickpara xinput

Al especificar el nombre del dispositivo, si lo conoce, solo xinputaparecerá --listese dispositivo, que puede restringir a --id-only:

El comando:

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

devolverá el valor de ID del dispositivo especificado:

11

información relacionada