如何删除字符串中的 \r\n 并将字符串制作成数组

How to remove \r\n in string and make string to array

我有从 api 获取的字符串,如下所示

/patha/pathb/pathc\r\n/patha/pathb/pathc\r\n/patha/pathb/pathc

如何拆分 /patha/pathb/pathc 到数组中的元素?

您可以使用 your_array=($(sed 's/\r\n/ /g' <<< $your_string))

如果您愿意,也可以使用 echo $your string | sed. . . .。要么工作正常。 echo 可能在任何地方都更具可读性和更多实施。

编辑:如果这些路径包括 space,这将是更好的选择 -

your_array=($(sed 's/ /~_~/g; s/\r\n/ /g' <<< $your_string))
i=0
for x in ${your_array[@]}; do your_array[$i]=$(sed 's/~_~/ /g' <<< $x) && let i++; done

我使用 ~_~ 来不覆盖任何现有字符。

Edit2:更好的方法是 -

temp=$(sed 's|\r||g; s|\|\\|g' <<< $your_string)
ifs=$IFS
IFS="
"
your_array=($(for x in $(eval echo -e $temp); do echo $x; done))
IFS=$ifs
:>arr=$(echo "/patha/pathb/pathc\r\n/patha/pathb/pathc\r\n/patha/pathb/pathc" | tr '\r\n' '\n'  | grep -v '^$')
:>for i in $arr
> do
> echo $i
> done
/patha/pathb/pathc
/patha/pathb/pathc
/patha/pathb/pathc
:>

使用tr

$ 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 的任何值,路径中的换行符除外 - 弄清楚如何使用 [=14=] (NUL) 而不是 \n 作为路径分隔符,如果是的话一个问题给你。

不确定为什么我无法使用 NUL 作为分隔符:

$ readarray -t -d $'[=11=]' arr < <(sed 's/\r\n/[=11=]/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

您可以创建一个具有局部范围 IFS 的数组。

my_str=$'a\r\nb\r\nc\r\n'
IFS=$'\r\n' arr=($(echo "$my_str"))

printf "%s" ${arr[0]} | hexdump -C
00000000  61                                                |a|
00000001

从本地 IFS 中删除 \r 后重试以查看差异。

IFS=$'\n' arr=($(echo "$my_str"))

printf "%s" ${arr[0]} | hexdump -C
00000000  61 0d                                             |a.|
00000002