【问题标题】:How to determine the line ending of a file如何确定文件的行尾
【发布时间】:2008-09-23 14:34:35
【问题描述】:

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

我知道我可以跑

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

【问题讨论】:

    标签: scripting line-endings


    【解决方案1】:

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

    【讨论】:

    • 文件不显示行尾。前任。 : "file .bashrc => .bashrc: ASCII English text" 需要一些额外的键吗?
    • @Fedir:是的,确实如此,只是如果文件有常规的 LF 行结尾,那么它不会打印任何输出。但如果文件有 CRLF、裸 CR 或混合行结尾,它会告诉你。
    • 在 OS X 上的仅 CRLF Perl 脚本上对我不起作用。可能是 GNU 扩展?
    • 这适用于某些文件类型,但不适用于其他文件类型。例如,在 Linux 上,它不会报告 html 文件的行尾。
    • "file foo.txt" 在 OS X 10.9 上运行良好。它打印“foo.txt:ASCII 文本,带有 CRLF 行终止符”
    【解决方案2】:

    你可以使用 grep

    egrep -l $'\r'\$ *
    

    【讨论】:

    • 出于某种原因,当我在 MacOS X shell 中运行此命令时,我会得到目录中所有文件的列表。甚至是我用“echo”test“>torderform6.cpp”新生成的一个。知道可能出了什么问题吗?
    • 它只是为我在 Ubuntu 上列出了文件夹中的所有文件。
    • 这个命令仍然会列出运行过 dos2unix 的文件。
    • 使用$(echo -e '\r')如果你不能让bash为你做ASCII扩展(用它替换$'\r'\$
    【解决方案3】:

    类似的东西:

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

    虽然其中一些正则表达式可能需要完善和整理。

    这将在每行的末尾输出带有 WIN、MAC 或 UNIX 的文件。如果您的文件在某种程度上是一个可怕的混乱(或差异)并且有混合结尾,那就太好了。

    【讨论】:

    • 在 Ubuntu 上为我工作,接受的答案似乎只是列出所有文件
    • 对我不起作用,给出:Unmatched ) in regex; marked by &lt;-- HERE in m/(?&amp;lt;!WIN) &lt;-- HERE \n/ at -e line 1.
    • 你需要替换 <与&lt;
    • &lt; 符号在之前的编辑中被弄乱了。我现在已经修好了。
    【解决方案4】:

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

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

    【讨论】:

    • 确实是最安全的方式。要仅转换所有找到的文件,只需在之后运行 find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }' | xargs flip -ub
    • 大多数故障保护不是——file 甚至并不总是在其输出中告诉“CRLF”,这取决于它是什么类型的文件。我发现对于 SVG 文件——包含很像纯文本文件的文本——file 没有提到使用的行尾类型。因此,此脚本与文件类型无关。只是说。否则看起来像一个理智的单线,上述限制是不可承受的。
    【解决方案5】:

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

    如果您从未看到 0x0D,那么它很可能是 Unix。如果您看到 0x0D 0x0A 对,则很可能是 MSDOS。

    【讨论】:

      【解决方案6】:

      Windows 使用 char 13 和 10 作为行尾,unix 只有其中一个(我不记得是哪一个了)。因此,您可以将 char 13 和 10 替换为 char 13 或 10(使用 unix 的那个)。

      【讨论】:

        【解决方案7】:

        当您知道哪些文件具有 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
        

        如果您从根目录运行它并包含文件,最后您将确定所有文件都以 Unix 行结尾。

        【讨论】:

          猜你喜欢
          • 2019-02-01
          • 2011-03-02
          • 1970-01-01
          • 1970-01-01
          • 2012-03-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-26
          • 2012-08-23
          相关资源
          最近更新 更多