如何从单词中提取两个数字然后存储在bash中的两个单独变量中?

时间:2012-10-05 10:52:43

标签: regex bash tr

我相信我的问题对于知道如何使用正则表达式的人来说非常简单,但我对此非常陌生,我无法找到一种方法。我发现了许多类似的问题,但没有一个可以解决我的问题。

在bash中,我有一些形式的变量     NW = [:数字:] + A = [:位:] + 例如,其中一些是nw = 323.a = 42并且nw = 90.a = 5 我想检索这两个数字并将它们放在变量$ n和$ a中。 我尝试了几种工具,包括perl,sed,tr和awk,但是无法使用这些工具,尽管我一直在谷歌搜索并试图将其修复一小时。 tr似乎是最适合的。

我想要一段能够实现以下目标的代码:

#!/bin/bash
ldir="nw=64.a=2 nw=132.a=3 nw=4949.a=30"
for dir in $ldir; do
    retrieve the number following nw and place it in $n
    retrieve the number following a and place it in $a
done
... more things...

3 个答案:

答案 0 :(得分:1)

如果您信任您的输入,则可以使用eval

for dir in $ldir ; do
    dir=${dir/w=/=}     # remove 'w' before '='
    eval ${dir/./ }     # replace '.' by ' ', evaluate the result
    echo $n, $a         # show the result so we can check the correctness
done

答案 1 :(得分:1)

如果你不信任你的输入:)请使用:

ldir="nw=64.a=2 nw=132.a=3 nw=4949.a=30"

for v in $ldir; do 
    [[ "$v" =~ ([^\.]*)\.(.*) ]]
    declare "n=$(echo ${BASH_REMATCH[1]}|cut -d'=' -f2)"
    declare "a=$(echo ${BASH_REMATCH[2]}|cut -d'=' -f2)"
    echo "n=$n; a=$a"
done

结果:

n=64; a=2
n=132; a=3
n=4949; a=30

肯定有更优雅的方式,这只是一个快速工作的黑客

答案 2 :(得分:0)

ldir="nw=64.a=2 nw=132.a=3 nw=4949.a=30"
for dir in $ldir; do
   #echo --- line: $dir
   for item in $(echo $dir | sed 's/\./ /'); do
      val=${item#*=}
      name=${item%=*}
      #echo ff: $name $val
      let "$name=$val"
   done
   echo retrieve the number following nw and place it in $nw
   echo retrieve the number following a and place it in $a
done