如何在正規表示式與 grep 或 sed 相符後僅傳回兩個數字?

如何在正規表示式與 grep 或 sed 相符後僅傳回兩個數字?

我正在編寫一個在啟動時運行的 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

相關內容