以下 bash 命令收集名称包含 ILITEK ILITEK-TP 的所有设备的 xinput id。
name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"'{print $2+0}')
这个脚本有效。但是,我想ILITEK ILITEK-TP Mouse
从这个 ID 数字列表中排除类似的条目。目前,ILITEK ILITEK-TP
和ILITEK ILITEK-TP Mouse
条目都被收集到ids
.
答案1
指某东西的用途
awk -Fid= "/$name/"'{print $2+0}'
是一个常见的错误。
你需要:
awk -F'id=' -v name="$name" '$0 ~ name{print $2+0}'
但最好grep
在这里使用:
name='ILITEK ILITEK-TP'
xinput --list | grep -oP "${name}.*?id=\K\d+"
正则表达式匹配如下:
节点 | 解释 |
---|---|
${name} |
变量名 |
.*? |
除 \n 之外的任何字符(0 次或多次(匹配尽可能少的数量)) |
id= |
'id=' |
\K |
重置比赛的开始(什么是K ept)作为使用后视断言的更短替代方案:环顾四周和正则表达式中对 \K 的支持 |
\d+ |
数字 (0-9)(1 次或多次(匹配尽可能多的数量)) |
答案2
您可以尝试使用grep
:
xinput --list |grep 'ILITEK ILITEK-TP'|grep -v 'ILITEK ILITEK-TP Mouse'
答案3
awk 有布尔值。所以你应该能够做一些调整:
name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"' && !/Mouse/{print $2+0}')
如果这没有帮助,请提供 xinput --list 输出的一些示例行。
(由于引用看起来不正确而进行了编辑。)