
我正在編寫一個在啟動時運行的 shell 腳本,該腳本會禁用一直在運行的追蹤區塊。我從 開始xinput list
,我透過管道連接到grep Stick
它,我需要透過管道連接到類似的東西grep id=
,這給了我兩個數字,通常是11。我需要寫一些類似foo=xinput list | grep Stick | grep id=
和 的東西foo 到 11。
⎡ 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