从bash命令shell中,解析行中的数字

从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

我从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 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