我有一个正则表达式,我用它来检测屏幕分辨率,如下所示
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
-一个数字