grep または sed で正規表現に一致した後に 2 つの数字を返すにはどうすればよいでしょうか?

grep または sed で正規表現に一致した後に 2 つの数字を返すにはどうすればよいでしょうか?

起動時に実行して、動作がおかしくなった追跡ナブを無効にするシェル スクリプトを作成しています。 から開始しxinput listgrep Stickこれを にパイプして、 のような何かにパイプする必要がありますgrep id=。これにより、通常は 11 である 2 つの数値が得られます。私が知る限り、数値は 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=、その後に 1 桁または 2 桁の数字が続く部分文字列に一致しますが、プレフィックスではなく数字のみが返されます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

関連情報