如何在正则表达式与 grep 或 sed 匹配后仅返回两个数字?

如何在正则表达式与 grep 或 sed 匹配后仅返回两个数字?

我正在编写一个在启动时运行的 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

相关内容