我正在编写一个在启动时运行的 shell 脚本,该脚本会禁用一直在运行的跟踪块。我从 开始xinput list
,我通过管道连接到grep Stick
它,我需要通过管道连接到类似的东西grep id=
,这给了我两个数字,通常是 11。据我所知,数字可以是 1 到 18 之间的任何地方,但我需要写一些类似于foo=xinput list | grep Stick | grep id=
和 的东西foo 到 11。这是 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)]
我需要得到的是 Stick 行中 id= 之后的数字,11。
答案1
长话短说,这是您想要的命令:
foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"
下面是更详细的解释。
您应该能够使用grep
包含以下内容的正则表达式来执行您想要的操作后视断言。关键成分是以下grep
表达式:
grep -Po '(?<=id=)\d\d?'
这将匹配以一两个数字开头id=
并后跟一两个数字的子字符串,但仅返回数字而不返回前缀id=
。
您可以通过以下方法进行测试:
echo "id=11" | grep -Po '(?<=id=)\d\d?'
这将11
作为其输出。将其应用到您的代码片段会产生以下结果:
foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"
作为第二个测试,假设我们将示例数据放入文件中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)]
然后运行以下命令:
cat data.txt | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?'
这将11
作为其输出。
答案2
指定AlpsPS/2 ALPS DualPoint Stick
到xinput
通过指定设备名称(如果已知),xinput
将--list
仅指定该设备,您可以将其范围缩小到--id-only
:
命令:
xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'
将返回指定设备的ID值:
11