如何使用sed从长字符串中提取键的值?

时间:2018-08-10 19:16:57

标签: linux bash shell awk

我有一个长字符串,我想从该字符串中提取键的值并将其存储在变量中。我想从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

2 个答案:

答案 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对。当然,如果您希望避免不必要地调用grepawksed或其他任何内容,那么您也可以获得其余数据

请注意,关联数组已在版本4中添加到bash中。如果您在macOS(或者实际上是在POSIX Shell)中进行此操作,则必须对其进行调整。