打印第 N 行文件与 Windows 中的文本文件行为异常



我有两个文件,这两个文件在我看来都如下所示。

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保留在每行的末尾。回显此字符时,会导致光标返回到左边距,而不前进到下一行。

相关内容

  • 没有找到相关文章