如何使用向前看排除正则表达式中的特殊字符



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

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

当我在脚本中使用它时,会得到这样的结果

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

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

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

有人能解释一下如何使用特殊字符来处理这个问题吗?我想只返回屏幕分辨率在下面的形式或一些变化。我要做的是区分双显示器和四显示器。

xrandr | grep -P '(.*d+xd+)*^(?![+]+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*

您可以跳过grep并在单个awk中完成此操作:

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

备选单gnu grep溶液:

xrandr | grep -oP 'connectedh+K(d+xd+|S+)'

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

你的逻辑可以被实现为

xandr | grep -oP 'bd+xd+(?!(?:+d++)?d)'

参见在线演示和正则表达式演示。

细节:

  • -oP-只输出匹配并启用PCRE正则引擎
  • bd+xd+(?!(?:+d++)?d):
    • b-字边界
    • d+-一个或多个数字
    • x- andx
    • d+-一个或多个数字
    • (?!(?:+d++)?d)-如果在当前位置的右边有
    • ,则会导致匹配失败。
    • (?:+d++)?-+,一个或多个数字和+的可选序列
    • d-一个数字

最新更新