2013-08-06 68 views
4

如果文件是unix格式(0x0a只在每行的末尾),我需要將文本文件轉換爲dos格式(每行只結束0x0d0x0a,而不是0x0a)。如何檢查文本文件的行尾以查看它是否爲unix或dos格式?

我知道如何轉換它(sed 's/$/^M/'),但不知道如何檢測文件的行尾字符。

我正在使用ksh。

任何幫助,將不勝感激。

[更新]: 有點想通了,這裏是我的ksh腳本來做檢查。

[[email protected]:/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被插入與Ctrl-VCtrl-M

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

回答

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

只需使用file命令。 如果文件最後包含CR LF行,則打印出該註釋: 'ASCII文本,帶有CRLF行結束符'

例如

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

然而,我的AIX機器中的ksh只告訴我'test.txt:ascii text',不管在'test.txt'中使用了哪種類型的行尾。它不告訴我是否包含CRLF。 –

1

我不能在AIX上測試,但嘗試:

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

它不適合我,總是說文件是UNIX格式,而文件實際上是DOS格式。 –

1

您可以簡單地從所有的行刪除任何現有回車,然後添加回車到所有行的末尾。那麼傳入文件的格式並不重要。傳出格式將始終爲DOS格式。

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

這是一條出路。但'\ r'不起作用。它需要由'^ M'('vi'的插入模式下的'Ctrl-V'和'Ctrl-M')替代。不過,我不想一直這樣做。沒有辦法檢查txt文件的行尾字符嗎? –

+0

@強旭 - 我不是sed的普通用戶,我更像一個Windows用戶,所以我不確定。但我相信你會需要正則表達式的後臺功能,並且我不認爲sed支持該功能。 – dbenham

4

DOS2UNIX的(和unix2dos)命令與Cygwin和最近的一些Linux發行版安裝的最新版本(7.1)版有一個方便的--info選項,打印出每個文件中不同類型的換行符的數量。這是DOS2UNIX的7.1(2014年10月6日)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 
0

我可能在這一個晚,但我有同樣的問題,我不想把特殊的^M字符(我擔心有些編輯可能無法正確顯示特殊字符,或者稍後程序員可能會用2個正常字符替換它:^和M ...)。

我找到了解決辦法喂特殊字符到grep,通過讓殼轉換其十六進制值:

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

可惜我不能讓KSH中$'[\x0D]'構建工作。 在ksh中,我發現這個: if head -1 $ {filename} | od -x | grep的 '0D0A $'>的/ dev/null的 然後 回聲 「贏」 其他 回聲 「UNIX」 網絡

od -x顯示在十六進制代碼的文本。 '0d0a$'是CR-LF(DOS-Win行結束符)的十六進制代碼。 Unix行結束符是'0a00$'

相關問題