如何确定文件的行结尾
我有一堆(数百)应该有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行结束0x0A
( 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的结尾。