如何删除字符串中的 \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
我有从 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