在特定分隔符和换行符之后拆分数组中的字符串

Split string in Array after specific delimited and New line

$string="name: Destination Administrator
    description: Manage the destination configurations, certificates and subaccount trust.
    readOnly:
    roleReferences:
    - roleTemplateAppId: destination-xsappname!b62
      roleTemplateName: Destination_Administrator
      name: Destination Administrator"

我有上面的字符串,每一行都用换行符分隔,我喜欢在“-”之后创建包含两列的数组,如下所示

Col1                    col2
roleTemplateAppId       destination-xsappname!b62
roleTemplateName        Destination_Administrator
name                    Destination Administrator

我在下面尝试过,但没有返回正确的数组

IFS='- ' read -r -a arrstring <<< "$string"
echo "${arrstring [1]}"

假设:

  • OP 无法使用 yaml 解析器(根据 Léa 的评论)
  • 输入保证有 \n 行结尾(在数据内)
  • - 仅出现在一个位置(如 OP 的样本输入中所述);否则我们需要更好地定义从哪里开始解析数据
  • 我们有兴趣解析 -
  • 之后的所有内容
  • 数据将根据:分隔符进行解析,第一个字段作为关联数组[=44中的索引=],而第二个字段将是存储在数组中的值
  • leading/trailing 要从数组索引和值中删除的空间

一个 sed 只提取我们感兴趣的行的想法:

$ sed -n '/- /,${s/-//;p}' <<< "${string}"
     roleTemplateAppId: destinationxsappname!b62
      roleTemplateName: Destination_Administrator
      name: Destination Administrator

添加更多位以去除 leading/trailing 个空格:

$ sed -n '/- /,${s/-//;s/^[ ]*//;s/[ ]*$//;s/[ ]*:[ ]*/:/;p}' <<< "${string}"                                          
roleTemplateAppId:destination-xsappname!b62
roleTemplateName:Destination_Administrator
name:Destination Administrator

从这里我们将把它提供给一个 while 循环,我们将在其中填充关联数组

unset      arrstring
declare -A arrstring                   # declare as an associative array

while IFS=':' read -r index value
do
    arrstring["${index}"]="${value}"
done < <(sed -n '/- /,${s/-//;s/^[ ]*//;s/[ ]*$//;s/[ ]*:[ ]*/:/;p}' <<< "${string}")

留给我们:

$ typeset -p arrstring
declare -A arrstring=([roleTemplateAppId]="destination-xsappname!b62" [name]="Destination Administrator" [roleTemplateName]="Destination_Administrator" )

$ for i in "${!arrstring[@]}"
do
    echo "$i : ${arrstring[$i]}"
done

roleTemplateAppId : destination-xsappname!b62
name : Destination Administrator
roleTemplateName : Destination_Administrator