如何解决如何使用前瞻排除正则表达式中的特殊字符
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'}
有人可以解释一下前瞻如何处理特殊字符,以便我解决这个问题吗?我只想以下面的形式或一些变体返回屏幕分辨率。我想要做的是区分双显示器和 4 显示器。
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*
解决方法
您可以跳过 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+)'
,
(.*\d+x\d+)*^(?![\+]+\d\+\d)
模式匹配并将除换行符以外的任意零个或多个字符的可选序列匹配并捕获到第 1 组中,尽可能多,然后是 1+ 数字、x
、1+ 数字,然后需要字符串位置的开始(这会使模式一直失败!)并确保没有一个或多个 +
字符、一个数字、一个 {{1 }} 和当前位置右侧的一个数字。 这看起来像是一个从不匹配任何字符串的非常损坏的模式。
您的逻辑可以实现为
+
参见 online demo 和 regex demo。
详情:
-
xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'
- 仅输出匹配并启用 PCRE 正则表达式引擎 -
-oP
:-
\b\d+x\d+(?!(?:\+\d+\+)?\d)
- 词边界 -
\b
- 一位或多位数字 -
\d+
- 一个x
-
x
- 一位或多位数字 -
\d+
- 如果在当前位置的右侧立即有 -
(?!(?:\+\d+\+)?\d)
-(?:\+\d+\+)?
、一个或多个数字和+
的可选序列
-
+
- 一个数字。
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。