0

我相信我的问题对于知道如何使用正则表达式的人来说非常简单,但我对它很陌生,我想不出办法。我发现很多类似的问题,但没有一个可以解决我的问题。

在 bash 中,我有一些形式为 nw=[:digit:]+.a=[:digit:]+ 的变量,例如,其中一些是 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...
4

3 回答 3

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
于 2012-10-05T10:59:33.117 回答
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

当然还有更优雅的方法,这只是一个快速的工作技巧

于 2012-10-05T11:03:53.700 回答
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
于 2012-10-05T11:20:30.293 回答