在bash中从k ='v'对中提取字符串中的值

时间:2016-01-29 22:07:35

标签: bash shell sh

所以我有以下字符串:

packageinfo="package: name='nl.test.app' versionCode='64' versionName='5.1' platformBuildVersionName='6.0-2438415'"

...设置为shell变量,允许以下内容:

echo $packageinfo

我想在name =之后提取引号之间的值,所以我需要包含nl.test.app的变量,我该怎么做?

3 个答案:

答案 0 :(得分:2)

假设是bash,而不是POSIX sh:

#!/bin/bash
#      ^^^^ IMPORTANT, not /bin/sh

re="name='([^']*)'"
if [[ $packageinfo =~ $re ]]; then
  echo "name is ${BASH_REMATCH[1]}"
fi

也就是说,当然也有POSIX sh解决方案。选择一个不需要外部工具的工具,例如awksed

#!/bin/sh

getval() {
  target=$1; shift
  q="'"
  for arg; do
    case $arg in
      *=*)
        k=${arg%%=*}
        v=${arg#*=}; v=${v#$q}; v=${v%$q}
        if [ "$k" = "$target" ]; then
          printf '%s\n' "$v"
          return 0
        fi
        ;;
    esac
  done
}

packageinfo="package: name='nl.test.app' versionCode='64' versionName='5.1' platformBuildVersionName='6.0-2438415'"

set -f # disable globbing

# expand without quotes to break into words; only safe with globbing disabled
getval name $packageinfo

答案 1 :(得分:1)

使用符合POSIX标准的awk解决方案来补充Charles Duffy的有用pure Bash/shell solutions,假设 - 通常情况下 - 使用bashshell标记问题只是意味着需要一个可以从shell中调用的解决方案,以便使用标准的Unix实用程序一个选项:

packageinfo="package: name='nl.test.app' versionCode='64' versionName='5.1' platformBuildVersionName='6.0-2438415'"

packagename=$(echo "$packageinfo" | awk -F".* name='|'" '{ print $2 }')

答案 2 :(得分:0)

您可以使用POSIX expr命令:

name=$(expr "$packageinfo" : ".*name='\([^']*\)'")