如果文件是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
^M
和vi
。
想知道是否有更好的方法。
答案 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 ...)。
我找到的解决方案通过让shell转换其十六进制值来将特殊字符提供给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$'