我觉得这应该在某个地方有一个简单的答案,但我一直找不到它,所以我在这里问。
我想编写一个脚本来禁用我的无线 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
(输出匹配部分)和-P
PCRE 的实现:
xinput list | grep -Po '2\.4G Composite Devic.*id=\K\d+'