0

私の質問は、正規表現の使い方を知っている人にとっては非常に簡単だと思いますが、私はそれが初めてで、それを行う方法がわかりません。これに似た質問がたくさん見つかりましたが、どれも私の問題を解決できませんでした。

bash には、nw=[:digit:]+.a=[:digit:]+ という形式の変数がいくつかあります。たとえば、nw=323.a=42 と nw=90.a があります。 =5 これらの 2 つの数値を取得して、変数 $n と $a に入れたいと思います。perl、sed、tr、awk など、いくつかのツールを試しましたが、1 時間かけてググって修正しようとしたにもかかわらず、これらのツールを使用できませんでした。ただし、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 に答える