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

В моем случае он уже был установлен, но мне просто нужно было сделать phpenmod mbstring, а затем apachectl graceful.

3
задан 9 January 2012 в 04: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 '()'`
2
ответ дан 25 May 2018 в 15:21
echo "Device Enabled (126):   1" | grep -P -o "[0-9]+" | head -1
echo помещает вашу строку в канал, который идет в grep, что является программой для применения регулярных выражений. Опция -P позволяет поведение типа PEARL (которое позволяет вам использовать +), а -o сообщает grep только выводить соответствующую часть строки. Каждое совпадение будет напечатано на новую строку, чтобы выбрать нужную строку. Поскольку мы хотим получить первое число, мы выберем первую строку. Если бы вас это интересовало, вы бы сделали head -2.
2
ответ дан 25 May 2018 в 15:21

Один из способов использования 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
2
ответ дан 25 May 2018 в 15:21

Хорошо, я буду бросать в свой 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) }'
2
ответ дан 25 May 2018 в 15:21

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

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
ответ дан 25 May 2018 в 15:21

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

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
ответ дан 25 May 2018 в 15:21

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

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