使用Windows中的文本文件打印奇怪的第N行文件

时间:2013-12-28 00:35:56

标签: bash shell plaintext

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

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

这些脚本导致它们在记事本创建的文件中表现如何?

1 个答案:

答案 0 :(得分:3)

vim创建的文件的行以LF结尾,与Unix一样。使用Notepad创建的文件的行以CR LF结尾,与DOS / Windows一样。 bash使用LF作为行分隔符,因此当它从第二个文件中读取时,它会在每行的末尾留下CR。当您回显此字符时,它会使光标返回到左边距,而不会前进到下一行。