извлечь номер из строки

У меня есть следующая строка

Device Enabled (126):   1

Могу ли я извлечь в переменную VAR только 126 и НЕ (126)?

пс 126 = случайное число

, пожалуйста, помогите мне!

РЕДАКТИРОВАТЬ Я вставляю свой сценарий, чтобы вы могли понять решение

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

в моем случае VALOREENABLE = (126) и VALORESENSE (256) я хочу 126, только 256 без (): (`

3
задан 9 January 2012 в 02:38

6 ответов

Есть много способов сделать это. Вот тот, который первым приходит мне на ум:

VALOREENABLE=`xinput list-props $ID | grep -i Enabled | grep -o "(.*)" | tr -d '()'`
VALORESENSE=`xinput list-props $ID | grep -i Profile | grep -o "(.*)" | tr -d '()'`
0
ответ дан 9 January 2012 в 02:38

Хорошо, я добавлю 2c, вы можете сделать это напрямую с помощью awk.

ID=`xinput list | grep -i TouchPad | awk -F= '{ print $2}' | awk '{print $1}'`
VALOREENABLE=`xinput list-props $ID | awk '/Enabled/ {print substr ($3, 2, 3) }'`
VALORESENSE=`xinput list-props $ID | awk '/Profile/ {print substr ($3, 2, 3) }'
0
ответ дан 9 January 2012 в 02:38

В одну сторону, используя sed:

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

Результат:

126

, поэтому для своего сценария вы можете попробовать:

#!/bin/bash

ID=`xinput list | grep -i TouchPad | awk -F= '{ print $2}' | awk '{print $1}'`
VALOREENABLE=`xinput list-props $ID | grep -i Enabled |awk '{print $3}'`
#VALORESENSE=`xinput list-props $ID | grep -i Profile |awk '{print $3}'`
VALORESENSE=`xinput list-props $ID | grep -i Profile | awk '{print $4}' | sed 's/.*(\([^)]*\)).*/\1/' `
echo $VALORESENSE
0
ответ дан 9 January 2012 в 02:38
echo "Device Enabled (126):   1" | grep -P -o "[0-9]+" | head -1
  • echo помещает вашу строку в канал
  • , который идет к grep , который является программой для применения регулярных выражений. Опция -P включает PEARL-подобное поведение (которое позволяет вам использовать +), а -o говорит grep выводить только совпадающую часть строки. Каждое совпадение будет напечатано на новой строке
  • , используйте головку , чтобы выбрать нужную строку. Поскольку нам нужен первый номер, мы выберем первую строку. Если бы вы были заинтересованы в этом, вы бы сделали head -2.
0
ответ дан 9 January 2012 в 02:38

Извлечение идентификатора может быть упрощено следующим образом (обратите внимание на использование $() вместо обратных кавычек):

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

Лично я бы использовал perl при извлечении чисел:

VALOREENABLE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*/$1/ and print if /Enabled/' )
VALORESENSE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*/$1/ and print if /Profile/' )
0
ответ дан 9 January 2012 в 02:38

Оболочка может сделать это:

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

Или, если Вы действительно любите использовать awk, устанавливаете разделителя полей, чтобы быть любой круглой скобкой

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

Используя Ваш пример кода, я записал бы:

ID=$(xinput list | awk -F= '/TouchPad/ {split($2, a, /[[:space:]]\+/); print a[1]}')
PROPS=$(xinput list-props $ID)
VALOREENABLE=$(awk -F '[()]' '/Enabled/ '{print $2}' <<< "$PROPS")
VALORESENSE=$(awk -F '[()]' '/Profile/ '{print $2}' <<< "$PROPS")
1
ответ дан 9 January 2012 в 02:38

Другие вопросы по тегам:

Похожие вопросы: