使用 bash 脚本从字符串中提取数字

使用 bash 脚本从字符串中提取数字

我觉得这应该在某个地方有一个简单的答案,但我一直找不到它,所以我在这里问。

我想编写一个脚本来禁用我的无线 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是这里的超集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支持-o(输出匹配部分)和-PPCRE 的实现:

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

相关内容