grepまたはsedに一致する正規表現の後に2つの数字だけを返す方法は?

grepまたはsedに一致する正規表現の後に2つの数字だけを返す方法は?

私は実行中のトレースブロックを無効にする起動時に実行されるシェルスクリプトを作成しています。で始めてxinput listパイプで接続しgrep Stick、そんなものでパイプしなければならないのですがgrep id=、それでは通常11という2つの数字が出てきます。私が知っている限り、数字は1から18の間ですが、foo=xinput list | grep Stick | grep id=11にはand fooのようなものを書く必要があります。以下は 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?'

これは、1桁または2桁の数字で始まり、後ろに1桁または2桁の数字が続く部分文字列と一致しますが、id=接頭辞は返さずに数字のみを返しますid=

次の方法でこれをテストできます。

echo "id=11" | grep -Po '(?<=id=)\d\d?'

これが11出力になります。これをコードスニペットに適用すると、次のような結果が得られます。

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

2番目のテストでサンプルデータをファイルに保存するとします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 Stickxinputに割り当てられる

デバイス名(既知の場合)を指定すると、そのデバイスのみが指定され、xinput--listのように範囲を狭めることができます--id-only

注文する:

xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'

指定されたデバイスのID値を返します。

11

関連情報