我有一堆(数百个)文件,应该具有Unix行结尾。 我强烈怀疑其中一些具有Windows行结尾,并且我想通过编程找出哪些需要更改。
我知道我可以在脚本中运行
flip -u或类似的命令来转换所有内容,但我想先识别那些需要更改的文件。
我有一堆(数百个)文件,应该具有Unix行结尾。 我强烈怀疑其中一些具有Windows行结尾,并且我想通过编程找出哪些需要更改。
我知道我可以在脚本中运行
flip -u或类似的命令来转换所有内容,但我想先识别那些需要更改的文件。
你可以使用grep
egrep -l $'\r'\$ *
$(echo -e '\r')
如果无法让 Bash 为您执行 ASCII 扩展(将 $'\r'
替换为它)。 - Bryce Guinta类似于以下内容:
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/(?<!WIN) <-- HERE \n/ at -e line 1.
- moshen<
- Joseph这是最保险的答案。Stimms的回答没有考虑子目录和二进制文件。
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
file
命令查找文件类型。带有CRLF的文件具有Windows回车符号。 file
命令的输出以冒号:
分隔,第一个字段是文件的路径。find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }' | xargs flip -ub
即可仅转换所有找到的文件。 - pixelbracketsfile
命令在输出中并不总是能够准确地指出" CRLF ",这取决于文件类型。我发现,在包含类似纯文本文件的文本的 SVG 文件中,file
命令没有提到使用的行结束符类型。因此,这个脚本并不是文件类型无关的。只是说一下。除此之外,这个单行命令看起来很合理,尽管前面所述的限制还存在。 - Armen MichaeliUnix使用一个字节,0x0A(换行符),而Windows使用两个字节,0x0D 0x0A(回车符,换行符)。
如果你从未看到0x0D,则很可能是Unix。如果你看到0x0D 0x0A对,则很可能是MS-DOS。
当您知道哪些文件具有 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 换行符。
Windows使用字符13和10作为行尾,Unix只使用其中一个(我不记得是哪一个)。因此,您可以将字符13和10替换为字符13或10(使用Unix的那个)。
dos2unix
功能有-i
选项来获取文件信息。我发现这是最可靠的识别罪犯的方法。这也在https://unix.stackexchange.com/a/231408/17800中有所描述。 - ikaerom