【发布时间】:2008-09-23 14:34:35
【问题描述】:
我有一堆(数百个)应该有 Unix 行结尾的文件。我强烈怀疑其中一些有 Windows 行尾,我想以编程方式找出哪些行尾。
我知道我可以跑
flip -u或脚本中的类似内容来转换所有内容,但我希望能够识别那些需要首先更改的文件。
【问题讨论】:
我有一堆(数百个)应该有 Unix 行结尾的文件。我强烈怀疑其中一些有 Windows 行尾,我想以编程方式找出哪些行尾。
我知道我可以跑
flip -u或脚本中的类似内容来转换所有内容,但我希望能够识别那些需要首先更改的文件。
【问题讨论】:
您可以使用file 工具,它会告诉您行尾的类型。或者,您可以只使用 dos2unix -U 将所有内容转换为 Unix 行结尾,而不管它以什么开头。
【讨论】:
你可以使用 grep
egrep -l $'\r'\$ *
【讨论】:
$(echo -e '\r')如果你不能让bash为你做ASCII扩展(用它替换$'\r'\$)
类似的东西:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
虽然其中一些正则表达式可能需要完善和整理。
这将在每行的末尾输出带有 WIN、MAC 或 UNIX 的文件。如果您的文件在某种程度上是一个可怕的混乱(或差异)并且有混合结尾,那就太好了。
【讨论】:
Unmatched ) in regex; marked by <-- HERE in m/(?&lt;!WIN) <-- HERE \n/ at -e line 1.
<
< 符号在之前的编辑中被弄乱了。我现在已经修好了。
这是最安全的答案。 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 没有提到使用的行尾类型。因此,此脚本与文件类型无关。只是说。否则看起来像一个理智的单线,上述限制是不可承受的。
Unix 使用一个字节,0x0A(换行),而 windows 使用两个字节,0x0D 0x0A(回车,换行)。
如果您从未看到 0x0D,那么它很可能是 Unix。如果您看到 0x0D 0x0A 对,则很可能是 MSDOS。
【讨论】:
Windows 使用 char 13 和 10 作为行尾,unix 只有其中一个(我不记得是哪一个了)。因此,您可以将 char 13 和 10 替换为 char 13 或 10(使用 unix 的那个)。
【讨论】:
当您知道哪些文件具有 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 行结尾。
【讨论】: