【问题标题】:KSH Split String IssuesKSH 拆分字符串问题
【发布时间】:2021-09-02 06:39:30
【问题描述】:

我在变量 Var 中有一个字符串。 值如下所示:

Var="Key1:Val1~Key2:Val2~"

我只需要这个用“~”分割并只分配给 KSH 中的一个数组

当我尝试Var2=$(echo $Var | sed $'s/~/\\n/g')

并检查 Var2 数组的大小,如下所示: ArrSize=${#Var2[@]}

我总是得到 1。我原以为会是 2。请帮助

【问题讨论】:

    标签: ksh


    【解决方案1】:

    假设您想使用x=( list of array items ) 填充数组的方法,那么您需要将赋值的右侧包装在一对括号中,例如:

    $ Var2=( $( echo $Var | sed $'s/~/\\n/g' ) )
    
    $ typeset -p Var2
    typeset -a Var2=(Key1:Val1 Key2:Val2)
    
    $ echo "${#Var2[@]}"
    2
    

    完成相同任务但减少子进程调用开销的其他选项:

    这里是字符串

    $ Var2=( $(sed 's/~/ /g' <<< "${Var}") )
    
    $ typeset -p Var2
    typeset -a Var2=(Key1:Val1 Key2:Val2)
    
    $ echo "${#Var2[@]}"
    2
    

    参数替换

    $ Var2=( ${Var//\~/ } )
    
    $ typeset -p Var2
    typeset -a Var2=(Key1:Val1 Key2:Val2)
    
    $ echo "${#Var2[@]}"
    2
    

    注意:虽然${var//~/ }ksh 中工作,但其他shell(例如bash)需要转义~(即\~); ksh 似乎适用于两者 - ~\~ = 所以我更新了答案以包含转义

    【讨论】:

    • 我需要在echo "${Var//\~/ }" 中添加一个反斜杠。你知道为什么吗?
    • @WalterA 你在什么外壳里?问题被标记为ksh,所以我只关注这个问题,即ksh93 替换了~;看起来bash 需要~ 被转义......所以我猜~bash 中的一个特殊字符,但老实说我只是在猜测这一点;也看起来像转义 ~ 也有效,所以(有点)便携式答案将包括转义;我会更新答案...
    • 我确实在 bash 中。
    • @Markp-fuso - 我非常感谢您的建议/解决方案。我会试试这个,让每个人都知道。再次感谢。支持您的解决方案(暂时,直到我尝试并将其标记为答案)
    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2023-01-12
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多