从bash命令shell中,解析行中的数字
我从bash中提取了一条日志线,如:从bash命令shell中,解析行中的数字,bash,Bash,我从bash中提取了一条日志线,如: There are 5 apples and 7 oranges 我想将5和7转换成bash变量,但在这样做时遇到了问题 awk“{print$3,$6}”不起作用,因为如果有香蕉,它们的位置可能会改变。如果数字可以与其水果关联,则可获得额外积分 提前感谢Grep将执行以下操作: echo 'There are 5 apples and 7 oranges' | grep -o -E '[[:digit:]]+' 为了得到水果: echo 'There
There are 5 apples and 7 oranges
我想将5和7转换成bash变量,但在这样做时遇到了问题
awk“{print$3,$6}”不起作用,因为如果有香蕉,它们的位置可能会改变。如果数字可以与其水果关联,则可获得额外积分
提前感谢Grep将执行以下操作:
echo 'There are 5 apples and 7 oranges' | grep -o -E '[[:digit:]]+'
为了得到水果:
echo 'There are 5 apples and 7 oranges' | grep -o -E '[[:digit:]]+ [[:alpha:]]+'
更紧凑的版本:
echo'有5个苹果和7个橙子'| egrep-o'[0-9]+\w+'
但是请注意,
\w
与[:alnum:][/code>同义,因此也将与“appl3s”匹配,例如。嗯,shell是一种奇怪的语言,您可以做一些好事。例如:
a="there are 7 apples"
for i in $a; do
case $i in
[0-9]*)
value=$i
expectname=1
;;
*)
test -n "$expectname" && name=$i
expectname=
;;
esac
done
echo $value
echo $name
如果有多个引用,则可以填充数组或bash映射。仅使用bash的方法,使用bash v4测试:
str=" There are 5 apples, 12 bananas and 7 oranges"
i=0
while [[ "$str" =~ ([0-9]+)" "([a-z]+)(.*) ]] ; do
num[$i]=${BASH_REMATCH[1]}
type[$i]=${BASH_REMATCH[2]}
str=${BASH_REMATCH[3]}
(( i++ ))
done
for (( i=0; i<${#num[@]}; i++ )); do
printf "%4d\t%s\t%s\n" $i ${num[$i]} ${type[$i]}
done
赛德呢?使用正则表达式并对每个匹配进行运算。您是否希望正好出现两个数字?
0 5 apples
1 12 bananas
2 7 oranges