
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 Stick
lo 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 grep
una expresión regular que incluya unafirmación de mirar hacia atrás. El ingrediente clave es la siguiente grep
expresió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 11
como 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 11
como resultado.
Respuesta2
Especificar AlpsPS/2 ALPS DualPoint Stick
para xinput
Al especificar el nombre del dispositivo, si lo conoce, solo xinput
aparecerá --list
ese 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