extrai o número de uma string

3

eu tenho a seguinte string

Device Enabled (126):   1

posso extrair em uma variável VAR apenas 126 e NOT (126)?

pág. 126 = número aleatório

por favor me ajude!

EDIT Eu colo meu script para que você possa entender a solução

ID='xinput list | grep -i TouchPad | awk -F= '{ print }' | awk '{print }''
VALOREENABLE='xinput list-props $ID | grep -i Enabled |awk '{print }''
VALORESENSE='xinput list-props $ID | grep -i Profile |awk '{print }'

no meu caso VALOREENABLE = (126) e VALORESENSE (256) eu quero 126, 256 somente sem (): ('

    
por r1si 08.01.2012 / 23:18

6 respostas

2

Existem muitas maneiras de fazer isso. Aqui está o primeiro que me vem à mente:

VALOREENABLE='xinput list-props $ID | grep -i Enabled | grep -o "(.*)" | tr -d '()''
VALORESENSE='xinput list-props $ID | grep -i Profile | grep -o "(.*)" | tr -d '()''
    
por andrewsomething 08.01.2012 / 23:53
2
echo "Device Enabled (126):   1" | grep -P -o "[0-9]+" | head -1
  • echo coloca sua string no pipe
  • que vai para o grep , que é um programa para aplicar expressões regulares. A opção -P ativa o comportamento semelhante a PEARL (que permite usar o + ), e o -o informa ao grep para gerar a saída apenas da parte correspondente da cadeia. Cada partida será impressa para uma nova linha
  • use head para escolher a linha desejada. Como queremos o primeiro número, vamos escolher a primeira linha. Se você estivesse interessado em um, você faria head -2 .
por niklasfi 08.01.2012 / 23:25
2

Uma maneira de usar sed :

sed 's/.*(\([^)]*\)).*//' <<<"Device Enabled (126):   1"

Resultado:

126

para o seu script, você pode tentar:

#!/bin/bash

ID='xinput list | grep -i TouchPad | awk -F= '{ print }' | awk '{print }''
VALOREENABLE='xinput list-props $ID | grep -i Enabled |awk '{print }''
#VALORESENSE='xinput list-props $ID | grep -i Profile |awk '{print }''
VALORESENSE='xinput list-props $ID | grep -i Profile | awk '{print }' | sed 's/.*(\([^)]*\)).*//' '
echo $VALORESENSE
    
por Birei 08.01.2012 / 23:25
2

OK, vou jogar meu 2c, você pode fazer isso diretamente com o awk

ID='xinput list | grep -i TouchPad | awk -F= '{ print }' | awk '{print }''
VALOREENABLE='xinput list-props $ID | awk '/Enabled/ {print substr (, 2, 3) }''
VALORESENSE='xinput list-props $ID | awk '/Profile/ {print substr (, 2, 3) }'
    
por Panther 09.01.2012 / 05:58
1

O shell pode fazer isso:

str="Device Enabled (126):   1"
old_IFS=$IFS
IFS="()"
words=($str)
number=${words[1]}

Ou, se você realmente gosta de usar o awk, defina o separador de campo como parêntese

number=$(awk -F '[()]' '{print }' <<< "Device Enabled (126):   1")

Usando seu código de exemplo, eu escreveria:

ID=$(xinput list | awk -F= '/TouchPad/ {split(, a, /[[:space:]]\+/); print a[1]}')
PROPS=$(xinput list-props $ID)
VALOREENABLE=$(awk -F '[()]' '/Enabled/ '{print }' <<< "$PROPS")
VALORESENSE=$(awk -F '[()]' '/Profile/ '{print }' <<< "$PROPS")
    
por glenn jackman 09.01.2012 / 15:40
0

A extração do ID pode ser simplificada (observe o uso de $() em vez de backticks):

ID=$(xinput list | awk '/TouchPad/{sub(/^.*id=/,"");sub(/\[.*/,"");print}')

Pessoalmente, usaria perl na extração dos números:

VALOREENABLE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*// and print if /Enabled/' )
VALORESENSE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*// and print if /Profile/' )
    
por Sergiy Kolodyazhnyy 16.06.2017 / 03:19

Tags