Linux 如何查找windows行结束(EOL)字符
我有几百GB的数据需要使用Cygwin中的unix粘贴实用程序粘贴在一起,但是如果文件中有windows EOL字符,它将无法正常工作。数据可能有也可能没有windows EOL字符,如果不需要的话,我不想花时间运行dos2unix 所以我的问题是,在Cygwin中,我如何确定这些文件是否具有windows EOL CRLF字符 我尝试创建一些测试数据并运行Linux 如何查找windows行结束(EOL)字符,linux,unix,sed,eol,dos2unix,Linux,Unix,Sed,Eol,Dos2unix,我有几百GB的数据需要使用Cygwin中的unix粘贴实用程序粘贴在一起,但是如果文件中有windows EOL字符,它将无法正常工作。数据可能有也可能没有windows EOL字符,如果不需要的话,我不想花时间运行dos2unix 所以我的问题是,在Cygwin中,我如何确定这些文件是否具有windows EOL CRLF字符 我尝试创建一些测试数据并运行 sed -r 's/\r\n//' testdata.txt 但无论是否已运行dos2unix,这似乎都是匹配的 谢谢。文件(1)实用程
sed -r 's/\r\n//' testdata.txt
但无论是否已运行dos2unix,这似乎都是匹配的
谢谢。文件(1)实用程序知道区别:
$ file * | grep ASCII
2: ASCII text
3: ASCII English text
a: ASCII C program text
blah: ASCII Java program text
foo.js: ASCII C++ program text
openssh_5.5p1-4ubuntu5.dsc: ASCII text, with very long lines
windows: ASCII text, with CRLF line terminators
文件(1)
已经过优化,可以尝试读取尽可能少的文件,因此您可能会幸运地大大减少查找和修复CRLF终端时需要执行的磁盘IO量
请注意,某些情况下的CRLF应保持原位:的捕获将使用CRLF。但这取决于你。:) 您可以使用
文件查找:
file /mnt/c/BOOT.INI
/mnt/c/BOOT.INI: ASCII text, with CRLF line terminators
CRLF是此处的有效值。如果您希望退出代码与sed不同,则不会如此。它是否执行替换取决于匹配。除非有错误,否则退出代码将为true
但是,您可以从grep
获得可用的退出代码
#!/bin/bash
for f in *
do
if head -n 10 "$f" | grep -qs $'\r'
then
dos2unix "$f"
fi
done
准备转换“#dos2unix”$i”时取消注释。如上所述,“文件”解决方案有效。下面的代码片段可能会有所帮助
#!/bin/ksh
EOL_UNKNOWN="Unknown" # Unknown EOL
EOL_MAC="Mac" # File EOL Classic Apple Mac (CR)
EOL_UNIX="Unix" # File EOL UNIX (LF)
EOL_WINDOWS="Windows" # File EOL Windows (CRLF)
SVN_PROPFILE="name-of-file" # Filename to check.
...
# Finds the EOL used in the requested File
# $1 Name of the file (requested filename)
# $r EOL_FILE set to enumerated EOL-values.
getEolFile() {
EOL_FILE=$EOL_UNKNOWN
# Check for EOL-windows
EOL_CHECK=`file $1 | grep "ASCII text, with CRLF line terminators"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_WINDOWS
return
fi
# Check for Classic Mac EOL
EOL_CHECK=`file $1 | grep "ASCII text, with CR line terminators"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_MAC
return
fi
# Check for Classic Mac EOL
EOL_CHECK=`file $1 | grep "ASCII text"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_UNIX
return
fi
return
} # getFileEOL
...
# Using this snippet
getEolFile $SVN_PROPFILE
echo "Found EOL: $EOL_FILE"
exit -1
感谢您提供了使用file(1)命令的提示,不过它确实需要进一步完善。我遇到的情况不仅是纯文本文件,而且一些“.sh”脚本的eol错误。和“文件”报告如下,不考虑eol:
xxx/y/z.sh: application/x-shellscript
因此需要“file-e soft”选项(至少对于Linux):
这将在目录xxx和子目录中查找所有DOS eol文件。grep recursive,带有文件模式过滤器
grep -Pnr --include=*file.sh '\r$' .
输出文件名、行号和行本身
./test/file.sh:2:here is windows line break
您可以使用dos2unix的-i选项来获取有关DOS Unix Mac换行符(按顺序)、bom和text/binary的信息,而无需转换文件
$ dos2unix -i *.txt
6 0 0 no_bom text dos.txt
0 6 0 no_bom text unix.txt
0 0 6 no_bom text mac.txt
6 6 6 no_bom text mixed.txt
50 0 0 UTF-16LE text utf16le.txt
0 50 0 no_bom text utf8unix.txt
50 0 0 UTF-8 text utf8dos.txt
使用“c”标志,dos2unix将报告要转换的文件,iow文件具有DOS换行符。要报告所有带有DOS换行符的txt文件,可以执行以下操作:
$ dos2unix -ic *.txt
dos.txt
mixed.txt
utf16le.txt
utf8dos.txt
要仅转换这些文件,只需执行以下操作:
dos2unix -ic *.txt | xargs dos2unix
如果需要对目录进行递归,请执行以下操作:
find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix
另请参见dos2unix的手册页。如果结果显示“ASCII文本,有很长的行,没有行终止符”会怎样?呵呵,一条没有任何行终止符的很长的行可能是粘贴(1)
的一个笨拙输入,但可能文件(1)
放弃得太快了?也许线比它检查的区域长。(快速浏览一下文件
的源代码(src/file.h
)看起来像是检查了256千字节(有多少个
),所以听起来你的输入确实有很长的一行缺少行终止符。)
dos2unix -ic *.txt | xargs dos2unix
find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix