3

当我从 excel 在 windows 中保存 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 文件失败。(创建空行)

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

4

2 回答 2

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");  
}

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

于 2011-04-27T17:02:01.950 回答
0

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

于 2011-04-27T16:57:43.003 回答