有没有一种方法可以使用Windows或Unix行终止来快速识别文件?


8

我知道我们可以使用dos2unix在Windows和Unix线路终端之间进行转换。我想知道是否有任何命令可以告诉我文件是否具有Windows或Unix行终止?

Answers:


11
$ file f1 f2 f3
f1: ASCII text, with CRLF, LF line terminators
f2: ASCII text, with CRLF line terminators
f3: ASCII text

如果您有必要检查文件中的每一行,则可以执行以下操作:

$ grep -c "^M" f1 f2
f1:0
f2:3

$ wc -l f1 f2
 3 f1
 3 f2
 6 total

使用Ctrl + V Ctrl + M输入“ ^ M”,它是ASCII回车(CR)字符。

在这里,我们看到文件f1有三行,但没有CR,因此所有的行尾都必须是Unix风格的单独LF。

文件f2具有相等数量的行和CR,因此可以合理地猜测它使用了MSDOS和Windows使用的CR,LF行尾。


1
file如果找到比ASCII更接近的匹配,即不输出行结束状态setup.py: a python script text executable。似乎无法找到一个标志来改变这种行为。
miracle2k 2014年

1
@ miracle2k:也许可以创建一个自定义的magicfile来执行此操作。file -m magicfile f1 f2 f3
RedGrittyBrick 2014年

1

在Windows上,一种快速的判断方法是在记事本中打开文件。记事本仅在Windows样式终端(CR + LF)上显示换行符,而在Unix终端(LF)上不显示换行符。因此,您的Unix文本将如下所示:

Line1Line2Line3Line4

而Windows文本将如下所示:

line1
line2
line3
line4

我对unix / linux平台不太熟悉,但是我敢肯定您可以对类似gedit或emacs的程序使用类似的技巧。


0
c=($(perl -0777ne 'print $_ =~ tr/\n//; print " "; 
                   print $_ =~ tr/\r//;'))
if   ((!(c[0] +   c[1]))) ;then echo no line endings  
elif ((  c[0] && !c[1] )) ;then echo LF
elif (( !c[0] &&  c[1] )) ;then echo CR 
elif ((  c[0] ==  c[1] )) ;then echo CRLF 
else echo "anbigious LF ${c[0]} CR ${c[1]}"
fi

请注意,为了速度起见,仅对\rs和\ns进行计数,但这将是一个非常怪异的文件,两种类型的数量相同,但不是Windows CRLF文件...

另请注意,* nix工具file不会对文件进行完整扫描,而此perl脚本会这样做。您没有提到希望在哪个平台上运行;我已经使用bash脚本来测试perl的输出,但是可以将其更改为Window cmd脚本。

您可以将文件通过管道传输到该文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.