torr falha assim que eu coloco \ d ou [0-9] no regex

1

Estou tentando combinar o '64' em:

state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,

e extraí-lo.

Eu tentei

echo "$line" | sed -n -e 's/^.*keycode\s\([0-9]+\).*$//p'

Que em minha mente deveria funcionar, mas isso não acontece.

Depois de mais alguns testes, o regex coincide com sucesso, até eu começar a introduzir dígitos.

echo "$line" | sed -n -e 's/^.*keycode\s.*/test/p'

funciona bem, mas

echo "$line" | sed -n -e 's/^.*keycode\s\d.*/test/p'
echo "$line" | sed -n -e 's/^.*keycode\s[0-9].*/test/p'

e relacionados não funcionam, mesmo que haja um dígito logo após o espaço.

Eu estou sentindo falta de algo óbvio?

    
por Brydon Gibson 11.05.2017 / 19:14

1 resposta

2

Há apenas um pequeno erro em sua expressão sed : o caractere mais + precisa ser ignorado.

echo "state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES," | sed -n -e 's/^.*keycode\s\([0-9]\+\).*$//p'

processa 64 conforme esperado. Aqueles que usaram a sintaxe PCRE devem prestar atenção nas diferenças ao usar outras ferramentas como sed ou awk , cada um tendo um conjunto peculiar de caracteres especiais, alguns dos quais precisam ser escapados, outros não.

Um exemplo é \d , que significa qualquer dígito no PCRE e tem um significado diferente em sed , conforme apontado por Cyrus em seu comentário: [0-9] ou [[:digit:]] deve ser usado no lugar.

perl -e é geralmente tão capaz quanto sed e awk , você pode querer considerar usá-lo se preferir sua sintaxe. Pode ser mais ou menos confuso do que suas contrapartes, dependendo do que você precisa fazer.

Veja introdutório artigos para perl -e , experimente com PCRE ou leia um sed útil ou awk tutorial.

    
por 16.05.2017 / 10:49

Tags