题
我有一大堆(百)的文件,都应该有Unix行的结局。我强烈怀疑他们中的一些有窗户线路的结局,并且我想要编程方式找出哪些做的。
我知道我只可以运行
flip -u或者类似的东西在一个脚本来转换一切,但我希望能够确定这些文件需要改变第一个。
解决方案
你可以使用grep
egrep -l \r'\$ *
其他提示
您可以使用 file
工具,会告诉你行结束的类型。或者,您可以使用 dos2unix -U
,它将所有内容转换为Unix行结尾,无论它是从什么开始的。
有些事情:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
虽然有些正则表达式可能需要改进和整理。
这将在每行末尾用WIN,MAC或UNIX输出您的文件。好的,如果你的档案是某种可怕的混乱(或差异)并且有混合的结局。
这里是最故障安全的答案。Stimms答案不账户的子目录和二进制文件
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
- 使用
file
找到的文件类型。那些CRLF有窗户返回的人物。输出file
是分隔的一个:
, 和第一场的道路的文件。
Unix使用一个字节0x0A(LineFeed),而Windows使用两个字节,0x0D 0x0A(回车,换行)。
如果你从未见过0x0D,那很可能就是Unix。如果你看到0x0D 0x0A对那么它很可能是MSDOS。
Windows使用char 13&amp; 10为行结束,unix只有其中一个(我不记得哪一个)。所以你可以取代char 13&amp; 10为char 13或10(使用unix的那个)。
当您知道哪些文件有Windows行结尾( 0x0D 0x0A
或 \ r \ n
)时,您将对该文件执行什么操作?我习惯,你将它们转换成Unix行结束( 0x0A
或 \ n
)。您可以使用 sed
实用程序将带有Windows行结尾的文件转换为Unix行结尾,只需使用命令:
#!/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
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt
你可以把它放到这样的脚本中:
<*>如果你从你的root目录用文件运行它,最后你将确保所有文件都是Unix行结尾。
不隶属于 StackOverflow