如何在linux中更改windows或mac文件的文件结尾?

时间:2011-04-27 15:45:01

标签: php windows linux macos line-endings

当我从excel中保存TSV文件时,它使用\ r或\ 015(八进制)的行结尾,它在vi中显示为^ M.

当我从excel上保存Mac上的TSV文件时,它使用\ r \ n或\ 015 \ 012(八进制)的行结尾,它在vi中显示为^ M.

我如何处理更改两个文件的行结尾而不添加额外的空白行但仍保持与Linux兼容的行结尾?

我目前在PHP中使用exec()来运行以下内容:

如果我使用:

cat {FILE} | tr -d "\015" > {NEW_FILE}

cat {FILE} | tr -d "\r" > {NEW_FILE}

适用于Windows文件,但Mac文件失败。 (删除所有行结尾)

如果我使用:

cat {FILE} | tr "\015" "\012" > {NEW_FILE}

cat {FILE} | tr "\r" "\n" > {NEW_FILE}

适用于Mac文件,但Windows文件失败。 (创建空行)

任何想法如何在同一个例程中处理?

2 个答案:

答案 0 :(得分:1)

我想我找到了解决这个问题的优雅解决方案。在我的PHP脚本中,我创建了以下内容:

$results = exec("cd $directory; grep -Pl $'\r\n' $filename");
if($results == $filename) {
    // Windows File (default)
    exec("cd $directory; cat $filename | tr -d '\015' > $tmpfile; mv $tmpfile $filename");      
} else {
    // MAC File
    exec("cd $directory; cat $filename | tr '\r' '\n' > $tmpfile; mv $tmpfile $filename");  
}

如果有人有改进,我愿意接受改进。

答案 1 :(得分:0)

用于Windows文件的dos2unix和用于mac文件的mac2unix。