【问题标题】:How do I convert text files in bash? (foo.txt to bar.txt)如何在 bash 中转换文本文件? (foo.txt 到 bar.txt)
【发布时间】:2011-11-15 13:58:51
【问题描述】:

我正在尝试通过 bash 使用 foo.txt >> bar.txt 将一个文本文件附加到另一个文本文件。问题是,foo.txt 是一个 windows 文本文件(我认为),因为一旦附加在 bar.txt 中

every new^M
line^M
ends^M
like this.^M

因此,它们肯定是两种不同的文件类型。

我已经在 Google 上搜索过答案,但 Google doesn't accept special characters like ">>" and "^" in search。我能找到的最接近的解决方案是a reported solution on commandlinefu.com,但它所做的只是从 bar.txt 中删除 r,这实际上根本不是解决方案。

所以,我有两个问题:

  1. 如何使用 bash 发现 foo.txt 的真正文件类型是什么?
  2. 如何正确转换 foo.txt 以使其可附加到 bar.txt?

【问题讨论】:

    标签: linux bash text encoding newline


    【解决方案1】:

    快速而肮脏的解决方案:

    tr -d '\r' < foo.txt
    

    【讨论】:

      【解决方案2】:
      1. file foo.txt 将输出:“ASCII 文本,带有 CRLF 行终止符”,如果文件具有 DOS 样式的行结尾。

      【讨论】:

      • 谢谢,解决了我一直在寻找的剩余答案。
      • 如果只是纯文本,是的。但是对于某些公认的文件类型,file 命令不会显示它是如何编码的。例如,file tmp.html 打印 tmp.html: HTML document text,无论编码如何(至少 Ubuntu 版本的 file 命令会这样做)。
      • file --mime-encoding foo.html 会输出 us-ascii, utf-8 &c.
      【解决方案3】:
      sed 's/$'"/`echo \\\r`/" foo.txt >> bar.txt
      

      或使用dos2unix,如果有的话。

      【讨论】:

      • 在尝试转换之前如何确定它是dos文件?
      • 在 vi 中查看?如果行尾有 ^M 字符,则为 dos 格式。或者,如果您使用的是 Windows,请将文件加载到记事本中。如果你根本没有换行符,那就是 unix 格式。
      • 即使没有回车符 (^M),sed 命令也可以安全使用。
      • 我会回来投票支持您提供 sed 解决方案,Marc(当我可以投票时,我的意思是)。我肯定首先在寻找本地解决方案,但现在我知道这两个问题的答案,我可能会使用 dos2unix 方法。非常感谢。
      • @trench 你可以使用file 命令在转换之前告诉文件的格式。但是,在已经是 unix 格式的文件上使用 dos2unix 是无害的。
      【解决方案4】:

      将 Windows 行尾转换为 dos2unix:

      dos2unix foo.txt
      

      【讨论】:

        【解决方案5】:

        使用fromdostodos,或unix2dosdos2unix

        【讨论】:

          【解决方案6】:

          查找命令dos2unixunix2dos。您不妨先复制一份 (cp)

          【讨论】:

            猜你喜欢
            • 2012-09-06
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 2013-04-28
            • 2017-03-30
            • 1970-01-01
            • 2013-04-28
            相关资源
            最近更新 更多