6

我有一个正则表达式,用于尝试检测屏幕分辨率,如下所示

xrandr | grep -P '(.*\d+x\d+)* | awk {'print$3'}

当我在我的脚本中使用时,它给了我这样的东西

输出

1920x1200+0+0
1920x1200+1920+0
primary
1920x1200+1920+1200

我尝试使用前瞻,但我猜我没有正确使用它,因为我得到了相同的匹配。

代码

xrandr | grep -P '(.*\d+x\d+)*^(?![\+]+\d\+\d) | awk {'print$3'}

有人可以解释前瞻如何与特殊字符一起使用,以便我解决这个问题吗?我只想以下面的形式或一些变化返回屏幕分辨率。我想要做的是区分双显示器和四显示器显示器。

xrandr | grep -P '(.*\d+x\d+)*^(?![\+]+\d\+\d) | awk {'print$3'} | tr -d '\\n'

期待

1920x12001920x1200primary1920x1200

或这个

1920x1200
1920x1200
primary
1920x1200

如果它只能返回屏幕分辨率,则可以加分。

1920x1200
1920x1200
1920x1200
1920x1200

xrandr 输出

Mon0 connected 1920x1200+0+0 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected 1920x1200+0+0 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected primary 1920x1200+0+1200 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected 1029x1200+1920+1200 0mm x 0 mm
   1920x1200_c 59.95*
4

2 回答 2

3

您可以跳过grep并一次性完成awk

xrandr | awk 'NF >= 3 && /[0-9]+x[0-9]+/ {sub(/[+-].*/, "", $3); print $3}'

1920x1200
1920x1200
primary
1029x1200

替代单一gnu grep解决方案:

xrandr | grep -oP 'connected\h+\K(\d+x\d+|\S+)'
于 2021-02-03T15:31:19.470 回答
2

(.*\d+x\d+)*^(?![\+]+\d\+\d)模式匹配并将除换行符之外的任何零个或多个字符的可选序列捕获到第 1 组中,尽可能多,然后是 1+ 位、x、 1+ 位,然后需要字符串位置的开头(这使得模式总是失败! )并确保在当前位置的右侧没有一个或多个+字符、一个数字、一个和一个数字。这看起来像一个非常腐败的模式,永远不会匹配任何字符串。+

您的逻辑可以实现为

xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'

请参阅在线演示正则表达式演示

详情

  • -oP- 仅输出匹配并启用 PCRE 正则表达式引擎
  • \b\d+x\d+(?!(?:\+\d+\+)?\d)
    • \b- 单词边界
    • \d+- 一位或多位数字
    • x- 一个x
    • \d+- 一位或多位数字
    • (?!(?:\+\d+\+)?\d)- 如果在当前位置的右侧有一个否定的前瞻,则匹配失败
    • (?:\+\d+\+)?- 一个或多个数字的可选序列++
    • \d- 一个数字。
于 2021-02-03T16:58:24.877 回答