我有两个文件,这两个文件在我看来都如下所示。
a
a
不同之处在于,我用vim
创建了其中一个,用酒版的记事本创建了另一个。我编写了以下脚本来一次打印这些文件的每一行,或多或少地模拟cat
(当然,这不是我的最终目标,但这是我想到的最简单的例子。
#!/usr/bin/env bash
readarray -t list_file < "$1"
for line in "${list_file[@]}"
do
echo "line content: "$line""
done
意料之中的是,将vim
创建的文件(预期为 5 个字节:a[newline][newline]a[newline]
)作为$1
,它会输出这个。
line content: "a"
line content: ""
line content: "a"
出乎意料的是,使用记事本创建的文件(它是 6 个字节;我不知道为什么。如$1
,它输出此内容。为什么要这样做?
"ine content: "a
"ine content: "
line content: "a"
我也尝试以完全不同的方式执行此操作,但以下脚本具有完全相同的问题。
#!/usr/bin/env bash
for line_number in $(eval echo {1..$(wc -l < "$1")})
do
echo "line content: $(sed -n "${line_number}p" "$1")"
done
这些脚本有什么问题导致它们在记事本创建的文件上表现得像这样?
由 vim
创建的文件的行以 LF
结尾,就像在 Unix 上一样。用Notepad
创建的文件有以CR LF
结尾的行,就像在DOS/Windows上一样。 bash
使用 LF
作为其行分隔符,因此当它从第二个文件中读取时,它会将CR
保留在每行的末尾。回显此字符时,会导致光标返回到左边距,而不前进到下一行。