【问题标题】:Remove file coding mark but preserve its coding删除文件编码标记但保留其编码
【发布时间】:2015-01-22 03:46:18
【问题描述】:

我有一个使用 UTF-8(无 BOM)编码的文件。文件正在 Windows 站点上创建,并通过 SFTP 传输到 Linux 服务器。在上面使用cat -e,我得到这样的东西:

cat -e file.txt

M-oM-;M-?test13;hbana0Kw;$
lala;LjgX$

现在,我知道M-oM-;M-? 代表 UTF-8(无 BOM)。有没有办法从文件中删除它但保留它的编码?

【问题讨论】:

  • 如果它不是 BOM,它是实际的字符数据,如果不更改文件的实际内容,就无法删除。但是,在我看来,它就像一个 BOM。 cut -b1-3 file | od -ch 的输出是什么?
  • 嗨,我是0000000 357 273 277 \n l a l \n bbef 0abf 616c 0a6c 0000010
  • 所以这是一个字节切换的 BOM,也就是 ZERO-WIDTH NO-BREAK SPACE。 (od 的输出是 little-endian 格式,进一步混淆了问题。)
  • 太好了,所以我弄错了它是什么。现在,有没有办法从 Linux 端删除它,或者我应该尝试在 Windows 站点上删除它?
  • sed -e '1s/^.//' file.txt

标签: linux shell utf-8


【解决方案1】:

将文件从 Windows 传输到 Linux 时,应用dos2unix 命令。这将删除 BOM 符号并将行编辑转换为 Unix 样式。

dos2unix file.txt

【讨论】:

    【解决方案2】:

    要从文件的第一行删除 BOM,您可以使用类似 sed -e '1 s/^.//' file.txt 的内容。

    sed 命令有地址和命令两部分。大多数情况下,您会看到 sed 不使用地址(这意味着适用于所有行),但您可以通过使用地址将命令操作限制为仅特定行。

    在这种情况下,地址是1,表示第一行。所以替换只适用于第一行并且打印每一行(因为这是默认的 sed 行为)。

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      相关资源
      最近更新 更多