grepを使用して正規表現で一致するグループのみを一致させますか?

grepを使用して正規表現で一致するグループのみを一致させますか?

setxkbmap私はすべてのゲームのコントロールを壊すタイピングにDvorakを使用しているので、ワインゲームを始める前にキーボードレイアウトを設定する必要があります。私が望むのは、ゲームを開始する前に現在のキーボードレイアウトを取得して変数に保存してから、ゲームの終了後に復元するスクリプトを書くことです。

ORIGINAL_LAYOUT=`setxkbmap -query | grep -P 'layout\:\s{5}(\w+)'`
setxkbmap us
wine ...
setxkbmap $ORIGINAL_LAYOUT

私が経験している問題は、grepが私のキャプチャグループだけでなく、行全体と一致することです。一致するキャプチャグループを簡単にダンプする方法はありますか?

たとえば、出力は次のようになりsetxkbmap -queryます。

rules:      evdev
model:      pc105
layout:     dvorak

レイアウトをつかむことに興味があります。

答え1

grepを-o使って少し変更できます

   -o, --only-matching
          Print  only the matched (non-empty) parts of a matching line, with each such
          part on a separate output line.

ORIGINAL_LAYOUT=`setxkbmap -query | grep -oP '(?<=layout\:\s{5})\w+'`

Lookbehindを使用するように正規表現を変更したので、一致しません。

答え2

次のコマンドを試してくださいawk

setxkbmap -query | grep layout | awk '{print $2}'

またはcutコマンドを使用してください

setxkbmap -query | grep layout | cut -d : -f2

関連情報