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