如何用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
相关产品推荐
相关产品推荐

