我有一个长字符串,我想从该字符串中提取键的值并将其存储在变量中。我想从userName
字符串中提取abc
的值。我尝试了下面的代码,但是它说文件名太长错误。
abc="Create [newSystem=System [identityDomain=bbundlesystemser201201-test, admin=AdminUser [firstName=BSystemAdminGivenName, middleName=null, lastName=BSystemAdminFalilyName, userName=bbundlesystemadminusername, password=*******, email=hello@example.com], idmConsoleURL=https://abc.com.jspx, sftpHost=d910.abc.com, sftpUser=3pyylzoo, sftpPwd=*******]]"
echo $abc
sed -n 's/^userName= //p' "$abc"
我在做错什么吗?我想提取userName
的值并将其存储在变量中。
userName=bbundlesystemadminusername
答案 0 :(得分:2)
您可以使用BASH正则表达式匹配:
[[ $abc =~ userName=([^][,[:space:]]+) ]] && userName="${BASH_REMATCH[1]}"
echo "$userName"
bbundlesystemadminusername
否则,您可以使用以下sed
命令:
userName=$(sed 's/.*userName=\([^][,[:space:]]*\).*/\1/' <<< "$abc")
答案 1 :(得分:2)
我想我会在bash 4中使用关联数组和进程替换来做到这一点:
$ declare -A a
$ while IFS== read k v; do a["$k"]="$v"; done < <(grep -oEi '[a-z]+=[^], ]+' <<<"$abc")
$ printf '%q\n' "${a[userName]}"
bbundlesystemadminusername
虽然这不能正确地尊重您输入变量的数据结构,但它会识别键=值对并将其保存在易于访问的数组中,仅使用单个grep -o
即可将字符串拆分为KV对。当然,如果您希望避免不必要地调用grep
或awk
或sed
或其他任何内容,那么您也可以获得其余数据
请注意,关联数组已在版本4中添加到bash中。如果您在macOS(或者实际上是在POSIX Shell)中进行此操作,则必须对其进行调整。