0

我试图让这个脚本在 wacom 平板电脑上切换区域,我正在使用 xsetwacom 来配置平板电脑,

这就是我试图使脚本看起来的方式(它有效,但仅适用于第一台平板电脑)

#!/bin/bash
variable =`xsetwacom --list | awk '/stylus/ {print $7}'`
xsetwacom --set $variable area 123 123 123 123

这就是 xsetwacom --list 的输出的样子

Wacom Intuos S Pad pad                id: 21   type: PAD
Wacom Intuos S Pen stylus             id: 22   type: STYLUS
Wacom Intuos S Pen eraser             id: 23   type: ERASER

并连接了不同的平板电脑

Wacom Bamboo 2FG 4x5 Pad pad          id: 21   type: PAD
Wacom Bamboo 2FG 4x5 Ped stylus       id: 22   type: STYLUS
Wacom Bamboo 2FG 4x5 Pen eraser       id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Finger touch     id: 24   type: TOUCH

因此,当我放置另一台平板电脑时,我得到的“$variable”的值发生了变化,因为有更多的单词,我该如何解决这个问题,我正在寻找的值是手写笔的 id 号,谢谢!。

4

4 回答 4

1

假设您想获取 id,您可以将它们作为最后的第三个字段 ( $(NF - 2)):

xsetwacom --list | awk '/stylus/ {print $(NF - 2)}'

或者您可以将字段分隔符更改为 2+ 个空格,然后打印第二个字段:

xsetwacom --list | awk --field-separator="[ ]{2,}" '/stylus/{print $2}'

这取决于如何xsetwacom更改更长名称的输出。

出于好奇,这里是“纯 awk”版本:

yes | awk '
{ if (!( "xsetwacom --list" | getline )) { exit; } }
$NF == "STYLUS" { system("xsetwacom --set " $(NF-2) " area 123 123 123 123") }
'
于 2018-08-30T00:42:14.223 回答
1

Bash 有内置的正则表达式支持,可以按如下方式使用:

id_re='id:[[:space:]]*([[:digit:]]+)'  # assign regex to variable

while IFS= read -r line; do
  [[ $line = *stylus* ]] || continue   # skip lines without "stylus"
  [[ $line =~ $id_re ]] || continue    # match against regex, or skip the line otherwise
  stylus_id=${BASH_REMATCH[1]}         # take the match group from the regex
  xsetwacom --set "$stylus_id" area 123 123 123 123 </dev/null
done < <(xsetwacom --list)

https://ideone.com/amv9O1您可以看到它正在运行(输入来自 stdin 而不是xsetwacom --list,当然),并stylus_id为您的两条线设置。

于 2018-08-30T00:53:39.807 回答
1

只需从末尾而不是从前面计算字段:

awk '/stylus/{print $(NF-2)}'

例如:

$ cat file
Wacom Intuos S Pad pad                id: 21   type: PAD
Wacom Intuos S Pen stylus             id: 22   type: STYLUS
Wacom Intuos S Pen eraser             id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Pad pad          id: 21   type: PAD
Wacom Bamboo 2FG 4x5 Ped stylus       id: 22   type: STYLUS
Wacom Bamboo 2FG 4x5 Pen eraser       id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Finger touch     id: 24   type: TOUCH

$ awk '/stylus/{print $(NF-2)}' file
22
22
于 2018-08-30T04:06:27.227 回答
0

像这样的东西?

$ ... | awk '/stylus/{for(i=1;i<NF;i++) if($i=="id:") {print $(i+1); exit}}' 

找到旁边的令牌id:

于 2018-08-30T01:26:45.187 回答