代码之家  ›  专栏  ›  技术社区  ›  flash

如何使用sed从长字符串中提取密钥的值?[副本]

  •  1
  • flash  · 技术社区  · 6 年前

    我有一个长字符串,我想从该字符串中提取一个键的值并将其存储在一个变量中。我想提取 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=bbundlesystemadminusername
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   anubhava    6 年前

    可以使用BASH regex匹配:

    [[ $abc =~ userName=([^][,[:space:]]+) ]] && userName="${BASH_REMATCH[1]}"
    echo "$userName"
    

    bbundlesystemadminusername
    

    否则,你可以用这个 sed

    userName=$(sed 's/.*userName=\([^][,[:space:]]*\).*/\1/' <<< "$abc")
    
        2
  •  2
  •   ghoti    6 年前

    我想我应该使用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
    

    虽然这并没有正确地尊重输入变量的数据结构,但它确实识别了key=value对,并将它们保存在一个易于访问的数组中,只使用一个 grep -o 把线分成千伏对。当然,如果您想避免不必要的调用 grep awk sed

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