如何确定文件的行结尾

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

我知道我可以跑

 翻转 

或类似的脚本来转换一切,但我希望能够识别那些需要改变的文件。

你可以使用grep

egrep -l $'\r'\$ * 

你可以使用file工具,它会告诉你线结束的types。 或者,你可以使用dos2unix -U ,它将所有的东西都转换成Unix的行结尾,而不pipe它开头的是什么。

有些东西是:

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

尽pipe一些正则expression式可能需要精炼和整理。

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

这是最安全的答案。 Stimms的回答并不包括子目录和二进制文件

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

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

如果你从来没有看到0x0D,那很可能是Unix。 如果你看到0x0D 0x0A对,那很可能是MSDOS。

Windows使用字符13和10行结束,unix只有其中之一(我不记得哪一个)。 所以你可以用char 13和10replacechar 13和10(使用unix的那个)。

当你知道哪些文件有Windows行结束符( 0x0D 0x0A\r \n )时,你将如何处理这些文件? 我将它们转换成Unix行结束0x0A0x0A\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的结尾。