\t 制表符在 bash 脚本中丢失

\t Tab is lost in bash script

我正在 bash 脚本中逐行读取文本文件。我正在阅读的文本文件是一个制表符分隔的 csv - 但是当我尝试剪切读取行时,它不起作用,似乎 \t 在某处转换为空白 space

下面的代码不是我最终要做的——我还没有对代码实施实际的工作量,直到可以可靠地读取数据。

for (( currlineno=2 ; $currlineno <= $maxlines ; currlineno++ )); do
currline=$(sed -n "$currlineno"p "$IMPORT_TABLE".csv )
echo $currline |cut -f2
done

现在,当我像下面这样更改两行时,它就可以工作了

for (( currlineno=2 ; $currlineno <= $maxlines ; currlineno++ )); do
currline=$(sed -n "$currlineno"p "$IMPORT_TABLE".csv |tr '\t' ';')
echo $currline |cut -f2 -d ';'
done

但我不能那样做,因为我的文本文件也包含“;” ',' 和 '。'在田野里。 Tab 是我唯一可以接受的选项,因为我的字段永远不会包含它。

那是因为你没有双引号你的变量。

tabbed=$'a\tb'
echo $tabbed : "$tabbed"

当bash看到引号外的变量时,它对其内容应用分词,而echo只是输出它的参数,用空格分隔。双引号使值成为一个参数,即使它包含空格、换行符等。