Это выполнимо, да.Если вы не возражаете поменять местами порядок массива, самый простой подход будет выглядеть примерно так:
s='dn: uid=svc_ddvportal2ssh,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_ddvportal2ssh svc_ddvportal2ssh krbpasswordexpiration: 20180607182429Z dn: uid=svc_ddvrundeckdeploy,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_ddvrundeckdeploy svc_ddvrundeckdeploy krbpasswordexpiration: 20180607182430Z dn: uid=svc_bo2ansible_mon,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_bo2ansible_mon svc_bo2ansible_mon krbpasswordexpiration: 20990101200000Z'
while [[ $s =~ (.*)(dn: .*) ]]; do
results+=( "${BASH_REMATCH[2]}" )
s=${BASH_REMATCH[1]}
done
declare -p results # print the resulting array
... который выдает в качестве вывода (с разрывами строки, добавленными для удобства чтения):
declare -a results='(
[0]="dn: uid=svc_bo2ansible_mon,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_bo2ansible_mon svc_bo2ansible_mon krbpasswordexpiration: 20990101200000Z"
[1]="dn: uid=svc_ddvrundeckdeploy,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_ddvrundeckdeploy svc_ddvrundeckdeploy krbpasswordexpiration: 20180607182430Z "
[2]="dn: uid=svc_ddvportal2ssh,cn=users,cn=accounts,dc=tenant,dc=ycsdev,dc=io cn: svc_ddvportal2ssh svc_ddvportal2ssh krbpasswordexpiration: 20180607182429Z "
)'
Если, напротив, вы хотите съесть штраф за производительность, чтобы сохранить исходный порядок, измените results+=( "${BASH_REMATCH[2]}" )
на results=( "${BASH_REMATCH[2]}" "${results[@]}" )
.
То, что мы здесь делаем, соответствует последовательности иззадний ход вперед (поскольку bash не имеет не жадных регулярных выражений, первое .*
соответствует всему * последнему dn:
).