Usando o grep para corresponder apenas a um grupo de correspondência em uma expressão regular?

2

Eu preciso definir o layout do meu teclado com setxkbmap antes de lançar os jogos do Wine, já que uso o Dvorak para digitar e isso quebra todos os controles do jogo. O que eu gostaria de fazer é simplesmente escrever um script que pegue o layout do teclado atual antes de iniciar o jogo, armazene-o em uma variável e depois restaure-o após o término do jogo:

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

O problema que estou tendo é que o grep corresponde à linha inteira e não apenas ao meu grupo de captura. Existe uma maneira de simplesmente despejar o grupo de captura correspondente?

Por exemplo, a saída de setxkbmap -query é:

rules:      evdev
model:      pc105
layout:     dvorak

Estou interessado em pegar o layout.

    
por Naftuli Kay 02.01.2012 / 19:39

2 respostas

5

Tente usar este comando awk :

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

ou use o comando cut

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

    
por 02.01.2012 / 19:50
3

Você pode usar -o e alterar o grep um pouco

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

Nós mudamos o regex para usar um look-behind, então não faz parte do jogo

    
por 02.01.2012 / 21:06