$ str='/patha/pathb/pathc\r\n/patha/pathb/pathc\r\n/patha/pathb/pathc'
$ readarray -t -d $'\n' arr < <(sed 's/\\r\\n/\n/g' <<< "$str")
$ declare -p arr
declare -a arr=([0]="/patha/pathb/pathc" [1]="/patha/pathb/pathc" [2]="/patha/pathb/pathc")
Вышеуказанное будет работать для любых значений str
, за исключением новых строк в путях - выясните, как использовать \0
(NUL) вместо \n
в качестве разделителя пути, если это является проблемой для вас.
Не уверен, почему я не смог заставить это работать с NUL в качестве разделителя:
$ readarray -t -d $'\0' arr < <(sed 's/\\r\\n/\0/g' <<< "$str")
$ declare -p arr
declare -a arr=([0]=$'/patha/pathb/pathc\\r\\n/patha/pathb/pathc\\r\\n/patha/pathb/pathc\n')
или с некоторыми их вариантами, чтобы я мог избежать вызова sed:
$ echo "${str//\\r\\n/\n}"
/patha/pathb/pathcn/patha/pathb/pathcn/patha/pathb/pathc
$ echo "${str//\\r\\n/"$'\n'"}"
/patha/pathb/pathc$'\n'/patha/pathb/pathc$'\n'/patha/pathb/pathc
$ echo "${str//\\r\\n/"$(printf $'\n')"}"
/patha/pathb/pathc/patha/pathb/pathc/patha/pathb/pathc