【问题标题】:How do I change the file endings for either windows or mac file in linux?如何在 linux 中更改 windows 或 mac 文件的文件结尾?
【发布时间】:2011-04-27 15:45:00
【问题描述】:

当我从 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 文件失败。 (创建空行)

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

【问题讨论】:

  • 试过 sed 吗? sed -e 's/$/\r/' unix-format.txt > win-format.txt
  • 它适用于 Windows,但不适用于 Mac。我需要一个适用于任一文件的解决方案。
  • 好吧,您可以尝试读取第一行 + 1 个字符的脚本,看看它是否以 \r 或 \r\n 结尾,然后在您自己的“转换器代码”中进行相应处理。像这样,您可以坚持使用纯 PHP 并且没有 3rd 方依赖项。

标签: php windows linux macos line-endings


【解决方案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");  
}

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

【讨论】:

    【解决方案2】:

    dos2unix 用于 windows 文件,mac2unix 用于 mac 文件。

    【讨论】:

    • 再次...我无法访问服务器上的那些实用程序。它们没有安装,也不能安装。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2011-06-24
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多