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 '()''
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 (): ('
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 '()''
echo "Device Enabled (126): 1" | grep -P -o "[0-9]+" | head -1
-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 head -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
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) }'
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")
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/' )
Tags bash