如何检查文本文件的行尾以查看它是unix还是dos格式?

时间:2013-08-06 15:31:52

标签: unix dos ksh end-of-line

如果文件是unix格式(0x0d0x0a仅在每一行的结尾)。

我知道如何转换它(0x0a),但不知道如何检测文件的行尾字符。

我正在使用ksh。

任何帮助都将不胜感激。

[更新]: 有点想通了,这是我的ksh脚本来做检查。

0x0a

在上面的脚本中,sed 's/$/^M/'应插入[qiangxu@host:/my/folder]# cat eol_check.ksh #!/usr/bin/ksh if ! head -1 $1 |grep ^M$ >/dev/null 2>&1; then echo UNIX else echo DOS fi ^Mvi

想知道是否有更好的方法。

6 个答案:

答案 0 :(得分:10)

只需使用file命令即可​​。 如果文件末尾包含CR LF行,则会通过注释打印出来: 'ASCII文本,带有CRLF行终止符'

e.g。

if file  myFile | grep "CRLF"  > /dev/null 2>&1;
  then
  ....
fi

答案 1 :(得分:5)

与Cygwin和一些最近的Linux发行版一起安装的 dos2unix (和 unix2dos )命令的最新版本(7.1)有一个方便的 - info < / strong>选项,用于打印每个文件中不同类型换行的计数。这是dos2unix 7.1(2014-10-06)http://waterlan.home.xs4all.nl/dos2unix.html

从手册页:

--info[=FLAGS] FILE ...
       Display file information. No conversion is done.

The following information is printed, in this order: 
number of DOS line breaks, number of Unix line breaks, number of Mac line breaks, byte order mark, text or binary, file name.

       Example output:
            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
            2     418     219  no_bom    binary  dos2unix.exe

Optionally extra flags can be set to change the output. One or more flags can be added.
       d   Print number of DOS line breaks.
       u   Print number of Unix line breaks.
       m   Print number of Mac line breaks.
       b   Print the byte order mark.
       t   Print if file is text or binary.
       c   Print only the files that would be converted.

With the "c" flag dos2unix will print only the files that contain DOS line breaks, unix2dos will print only file names that have Unix line breaks.

因此:

if [[ -n $(dos2unix --info=c "${filename}") ]] ; then echo DOS; fi

相反:

if [[ -n $(unix2dos --info=c "${filename}") ]] ; then echo UNIX; fi

答案 2 :(得分:2)

if awk  '/\r$/{exit 0;} 1{exit 1;}' myFile
then
  echo "is DOS"
fi

答案 3 :(得分:1)

我无法在AIX上测试,但请尝试:

if [[ "$(head -1 filename)" == *$'\r' ]]; then echo DOS; fi

答案 4 :(得分:1)

您可以简单地从所有行中删除任何现有的回车符,然后将回车符添加到所有行的末尾。然后输入文件的格式无关紧要。传出格式将始终为DOS格式。

sed 's/\r$//;s/$/\r/'

答案 5 :(得分:0)

我可能迟到了,但我有同样的问题,我不想在我的剧本中加入特殊的^M字符(我担心一些编辑器可能无法正确显示特殊字符,或者某些后来的程序员可能会用2个普通字符替换它:^和M ...)。

我找到的解决方案通过让she​​ll转换其十六进制值来将特殊字符提供给grep:

if head -1 ${filename} | grep $'[\x0D]' >/dev/null
then
  echo "Win"
else
  echo "Unix"
fi

遗憾的是,我无法使$'[\x0D]'构造在ksh中运行。 在ksh中,我发现了这个:     如果头-1 $ {filename} | od -x | grep&#39; 0d0a $&#39; &GT;的/ dev / null的     然后       echo&#34; Win&#34;     其他       回声&#34; Unix&#34;     网络

od -x以十六进制代码显示文本。 '0d0a$'是CR-LF(DOS-Win行终止符)的十六进制代码。 Unix行终止符是'0a00$'