从字符串中提取数字

从字符串中提取数字

我有以下字符串

Device Enabled (126):   1

我可以在变量 VAR 中仅提取 126 而不是 (126) 吗?

ps 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,而不需要():(`

答案1

有很多方法可以做到这一点。这是我首先想到的一个:

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

echo "Device Enabled (126):   1" | grep -P -o "[0-9]+" | head -1
  • 回声把绳子放进管道
  • 那是grep,这是一个应用正则表达式的程序。该选项-P启用类似 PEARL 的行为(使您可以使用+),并且-o告诉 grep 仅输出字符串的匹配部分。每个匹配项都将打印到新行
  • 使用选择您想要的线。因为我们想要第一个数字,所以我们将选择第一行。如果您对 1 感兴趣,您可以这样做head -2

答案3

一种使用方式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

答案4

shell 可以做到:

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")

相关内容