Bashスクリプトを使用して文字列から数値を抽出する

Bashスクリプトを使用して文字列から数値を抽出する

どこかに簡単な答えがあるようですが、見つからないのでここに質問します。

.NETを使用してワイヤレスUSBキーボードを無効にするスクリプトを作成したいと思いますxinput --disable

私はxinput list | grep 2.4G\ Composite\ Devic次のような結果を得ました。

↳ 2.4G Composite Devic id=29 [slave keyboard (3)]

id=これで、この場合、パイプで接続できる一般的な数値形式で29を取得する方法に関する問題が解決されました。xinput --disable

答え1

オプション引数は、xinputデバイス名を文字列として受け入れます。

$ xinput --list --id-only '2.4G Composite Devic'
29
$ xinput --disable '2.4G Composite Devic' # Equivalent to 'xinput --disable 29'
  • フルネームでなければなりません(ワイルドカードや正規表現パターンを含めることはできません)。

答え2

それでも正規表現が必要な場合、Perlベースのソリューションは次のようになります。

echo "↳ 2.4G Composite Devic id=29   [slave  keyboard (3)]" | perl -pe 's/.*id=(\d+)\s.*/$1/g'

答え3

使用awk:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | awk '{gsub(/id=/,"",$4); print $4}'
29

使用sed:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | sed 's/.*id\=\([0-9]\+\).*/\1/g'
29

grepを使用してください:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | grep -Eo 'id=[0-9]+' | grep -Eo '[0-9]+'
29

答え4

sedはhereの親セットなので、grep次のようにすることができます。

xinput list |
  sed -n '/.*2\.4G Composite Devic.*id=\([[:digit:]]\{1,\}\).*/\1/p'

拡張正規表現をsedサポートするとより明確になります。-E

xinput list |
  sed -nE '/.*2\.4G Composite Devic.*id=([[:digit:]]+).*/\1/p'

(出力マッチング部分)grepサポートとPCRE実装を介して:-o-P

xinput list | grep -Po '2\.4G Composite Devic.*id=\K\d+'

関連情報