我有一个bash数组OUTARRAY
,我将填充来自处理INARRAY
的值。我经常附加OUTARRAY
个特殊字符,即\t
和\n
所以它可能看起来像:
OUTARRAY[j]="\n"
或
OUTARRAY[j]="${INARRAY[i]}\t"
最后我使用
将OUTARRAY
转储到一个文件中
printf "%s" "${OUTARRAY[@]}" > ${OUTFILE}
然而,我得到的结果是,单行文件中打印了所有特殊字符:
\n2771\t2899\t7624\t2911\t\n2772\t2904\t7706\t2911\t\n2771\t2909
相反,我想要圆柱输出。像
这样的东西2771 2899 7624 2911
2772 2904 7706 2911
等等。 我做错了什么? 谢谢
答案 0 :(得分:5)
bash
不会在引用的字符串中解释C样式的反斜杠转义(\n
)。
相反,请使用bash
语法$'\n'
:
OUTARRAY[j]=$'\n'
OUTARRAY[j]="${INARRAY[i]}"$'\t'
如果从定义开始,您可能会发现它更具可读性:
NL=$'\n'
TAB=$'\t'
然后您可以在双引号字符串中自由插入${NL}
和${TAB}
。
或者,您可以使用bash扩展名:
printf
通常会以格式扩展C样式的反斜杠转义,但不会在参数中扩展。但是,如果您使用的是bash,则可以使用特定于bash的%b
printf
格式,该格式会在相应的参数中扩展反斜杠转义。我并不赞同这个解决方案,但它应该没有其他修改:
printf "%b" "${OUTARRAY[@]}" > ${OUTFILE}
顺便说一下,对bash变量名使用ALL CAPS并不是一个好方法,因为它增加了它们与bash /特定于系统的环境变量冲突的可能性。
答案 1 :(得分:5)
不插入字符串\t
或\n
,而是插入实际标签和换行符:
outarray[j]=$'\n'
outarray[j]=${inarray[i]}$'\t'
现在这不是一个好策略。相反,不要将格式设置在数组中,而是使用printf
格式化数组的显示方式:如果您希望每行4个字段,则用制表符分隔:
printf '%s\t%s\t%s\t%s\n' "${outarray[@]}"
(顺便说一句,我小写了你的变量名,它好多了。)
答案 2 :(得分:1)
其他答案是正确的方法,但可以按原样打印您的数据。您可以使用echo -ne
和循环来打印您的值:
$ arr=( "a\t" "b\n" "c\t" "d\n" )
$ for i in "${arr[@]}"; do echo -ne $i; done
a b
c d
-n
切换到echo
会删除尾随换行符,-e
表示将解释反斜杠转义字符。