使用 grep 只匹配正则表达式中的匹配组?

使用 grep 只匹配正则表达式中的匹配组?

我需要在setxkbmap启动 Wine 游戏之前设置键盘布局,因为我使用 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

您可以使用-o并稍微更改 grep

   -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+'`

我们更改了正则表达式以使用后视,因此它不是匹配的一部分

答案2

尝试使用这个awk命令:

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

或使用cut命令

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

相关内容