一个纯 bash 解决方案,只会在选项卡上拆分,并保留换行符和其他有趣的符号(如果有):
IFS=$'\t' read -r -a arr -d '' < <(printf '%s' "$line")
试试看:
$ line=$'zero\tone with\nnewlines\ttwo\t three \n\t\tfive\n'
$ IFS=$'\t' read -r -a arr -d '' < <(printf '%s' "$line")
$ declare -p arr
declare -a arr='([0]="zero" [1]="one with
newlines" [2]="two" [3]=" three
" [4]="five
")'
如您所见,这完美无缺:它保留了所有内容(空格、换行符等),仅在制表符处拆分。
有一个缺点:它不处理“空字段”:观察 ; 中有两个连续的选项卡line
。我们希望在 中得到一个空字段arr
,但事实并非如此。
还有一个不太明显的缺点:read
is的返回码1
,所以从技术上讲,对于 Bash,这个命令是失败的。除非您使用set -e
or ,否则这绝对不是问题,set -E
但无论如何都不推荐这样做(所以您不应该这样做)。
如果您可以忍受这两个小缺点,那么这可能是理想的解决方案。
请注意,我们使用< <(printf '%s' "$line")
而不是<<< "$line"
feed read
,因为后者插入了一个尾随换行符。