You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash正则表达式匹配精确数字串?提取指定PID窗口ID

问题原因

你的正则表达式存在两个关键错误:

  • 第二列的匹配规则-?[0-9]仅能匹配单个数字,但实际第二列是完整的整数(比如示例中的0),导致后续空格与第三列的匹配逻辑混乱。
  • 第二列与第三列之间的空格用了单个[[:space:]],但wmctrl -lp的输出列之间是多个空格分隔的,这会让正则错误匹配第三列的开头数字。

两个问题叠加后,正则错误匹配了第一行的0x03600007 0 1(把第三列1206的第一个1当成了目标值15610的开头)。

解决方案

修正正则表达式

调整正则规则,让第二列匹配完整整数,同时正确处理列间的多空格:

# 匹配整行中第三列为15610的内容
regex="^0x[0-9a-z]{8}[[:space:]]+-?[0-9]+[[:space:]]+15610"
[[ $string =~ $regex ]] && echo "${BASH_REMATCH[0]}"

# 如果只想提取第一列(窗口ID),给第一列添加捕获组
regex="^(0x[0-9a-z]{8})[[:space:]]+-?[0-9]+[[:space:]]+15610"
[[ $string =~ $regex ]] && echo "${BASH_REMATCH[1]}"

更高效的替代方案:用awk处理

对于这种列结构明确的文本,用awk比正则更可靠,它会自动处理列间的多空格分隔:

wmctrl -lp | awk '$3 == 15610 {print $1}'

这条命令直接筛选第三列等于15610的行,并输出对应的第一列窗口ID。

内容的提问来源于stack exchange,提问作者nivek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:52:36