在特定分隔符和换行符之后拆分数组中的字符串
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
$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