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

Naf*_*Kay 3 grep regular-expression

我需要setxkbmap在启动 Wine 游戏之前设置我的键盘布局,因为我使用 Dvorak 进行打字,这会破坏每个游戏的控件。我想做的只是编写一个脚本,在开始游戏之前获取当前的键盘布局,将其存储在一个变量中,然后在游戏完成后恢复它:

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

我遇到的问题是 grep 匹配整行,而不仅仅是我的捕获组。有没有办法让我简单地转储匹配的捕获组?

例如,输出setxkbmap -query为:

rules:      evdev
model:      pc105
layout:     dvorak
Run Code Online (Sandbox Code Playgroud)

我有兴趣抓住布局。

phe*_*mer 6

您可以-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.
Run Code Online (Sandbox Code Playgroud)

.

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

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

  • 注意:```-P``` 不支持,因为 OSX Lion 和 BSD grep (2认同)

har*_*kat 5

尝试使用此awk命令:

setxkbmap -query | grep layout | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

或使用cut命令

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

  • `grep` 是不必要的,请参阅 jasonwryan 对该问题的评论。 (3认同)