如何确定文件的行结尾

时间:2008-09-23 14:34:35

标签: scripting line-endings

我有一堆(数百个)应该有Unix行结尾的文件。我强烈怀疑其中一些有Windows行结尾,我想以编程方式找出哪些内容。

我知道我可以在脚本中运行

flip -u
或类似内容来转换所有内容,但我希望能够识别那些需要先更改的文件。

7 个答案:

答案 0 :(得分:68)

您可以使用file工具,它会告诉您行结尾的类型。或者,您可以使用dos2unix -U将所有内容转换为Unix行结尾,无论其开头是什么。

答案 1 :(得分:28)

你可以使用grep

egrep -l $'\r'\$ *

答案 2 :(得分:14)

有些事情:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

虽然有些正则表达式可能需要改进和整理。

这将在每行末尾用WIN,MAC或UNIX输出您的文件。好的,如果你的档案是某种可怕的混乱(或差异)并且有混合的结局。

答案 3 :(得分:4)

这是最安全的答案。 Stimms答案不考虑子目录和二进制文件

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • 使用file查找文件类型。那些有CRLF的人有窗口返回字符。 file的输出由:分隔,第一个字段是文件的路径。

答案 4 :(得分:3)

Unix使用一个字节0x0A(LineFeed),而Windows使用两个字节,0x0D 0x0A(回车,换行)。

如果你从未见过0x0D,那很可能就是Unix。如果你看到0x0D 0x0A对那么它很可能是MSDOS。

答案 5 :(得分:0)

Windows使用char 13&amp; 10为行结束,unix只有其中一个(我不记得哪一个)。所以你可以取代char 13&amp; 10为char 13或10(使用unix的那个)。

答案 6 :(得分:0)

当您知道哪些文件包含Windows行结尾(0x0D 0x0A\r \n)时,您将对该文件执行哪些操作?我习惯,你会将它们转换成Unix行结束(0x0A\n)。您可以使用sed实用程序将带有Windows行结尾的文件转换为Unix行结尾,只需使用命令:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

你可以把它放到这样的脚本中:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

如果你从你的root目录用文件运行它,最后你将确保所有文件都是Unix行结尾。