所以我有以下字符串:
packageinfo="package: name='nl.test.app' versionCode='64' versionName='5.1' platformBuildVersionName='6.0-2438415'"
...设置为shell变量,允许以下内容:
echo $packageinfo
我想在name =之后提取引号之间的值,所以我需要包含nl.test.app
的变量,我该怎么做?
答案 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解决方案。选择一个不需要外部工具的工具,例如awk
或sed
:
#!/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,假设 - 通常情况下 - 使用bash
或shell
标记问题只是意味着需要一个可以从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='\([^']*\)'")