Shell 脚本使用 sed/awk 提取值对?

Shell 脚本使用 sed/awk 提取值对?

给定一个像这样的字符串:

NAME="bla" TYPE="test" SIZE="10"

我想将每对的值放入单独的 shell 脚本变量中。举例来说,假设我们有三个变量,我想在第一个变量中加载值 bla,在第二个变量中加载 test,在第三个变量中加载 10。

name=bla
type=test
size=10

到目前为止我尝试过的:

echo \"NAME=\"bla\" TYPE=\"test\" SIZE=\"10\"" | awk '{print Var, $1}'

但这将返回整个键值对,而不仅仅是值。有没有一个好的方法可以用 sed 或 awk 来做到这一点?

答案1

我不一定推荐它,但如果您完全控制字符串包含的内容并且不包含任何通配字符等,您可以执行以下操作:

$ cat tst.sh
#!/usr/bin/env bash

str='NAME="bla" TYPE="test" SIZE="10"'
declare $str

echo "NAME=$NAME"
echo "TYPE=$TYPE"
echo "SIZE=$SIZE"

$ ./tst.sh
NAME="bla"
TYPE="test"
SIZE="10"

$ cat tst.sh
#!/usr/bin/env bash

str='NAME="bla" TYPE="test" SIZE="10"'
declare ${str,,}

echo "name=$name"
echo "type=$type"
echo "size=$size"

$ ./tst.sh
name="bla"
type="test"
size="10"

答案2

我提出这个解决方案:

$ string='NAME="bla" TYPE="test" SIZE="10"'
$ IFS=' ' read -a a <<< "$string"
for i in "${a[@]}"; do
  var="${i%%=*}"
  value="${i##*=}"
  declare "${var,,}"="${value//\"/}"
done

然后

$ echo $name
bla
$ echo $type
test
$ echo $size
10

答案3

尽管已经有更好的答案(declare $str),但我将在这里留下一些其他选项。

source

source <(echo 'NAME="bla" TYPE="test kkk" SIZE="10"')

eval

eval 'NAME="bla" TYPE="test kkk" SIZE="10"'

两者都处理参数转义和空格(例如SIZE="with a space")。

不过,两者都受参数扩展的影响:SIZE="*"SIZE="$(hostname)"将被扩展/运行。

答案4

不确定,但如果您想将值存储在另一个变量中,您可以执行以下操作:

echo "NAME="bla" TYPE="test" SIZE="10"" | tr ' ' '\n' | while read line
do
   #this will give you the value. save it in any variable you want.
   name=$(echo $line | awk -F= '{print $2}') 
done

获得值后,使用 if 条件根据值将它们存储在 diff 变量中。

相关内容