我有以下字符串
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")