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 に一致し、改行文字以外の 0 個以上の文字の任意のシーケンスを可能な限り多く、次に 1 桁以上、x
にキャプチャします。 、1桁以上、そして文字列位置の開始が必要です(これにより、パターンは常に失敗します! ) そして、1 つ以上の +
がないことを確認します 文字、数字、+
現在位置のすぐ右側の数字。 これは、どの文字列とも一致しない非常に壊れたパターンのようです。
ロジックは次のように実装できます
xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'
オンライン デモと正規表現デモをご覧ください。
詳細em> :
-oP
- 一致のみを出力し、PCRE 正規表現エンジンを有効にします\b\d+x\d+(?!(?:\+\d+\+)?\d)
:\b
- 単語境界\d+
- 1 つ以上の数字x
-x
\d+
- 1 つ以上の数字(?!(?:\+\d+\+)?\d)
- 現在の場所のすぐ右にある場合、一致に失敗する否定的な先読み(?:\+\d+\+)?
-+
のオプションのシーケンス 、1 つ以上の数字および+
\d
- 数字