【问题标题】:Replace  with space in a file用文件中的空格替换 Â
【发布时间】:2018-06-17 18:10:34
【问题描述】:

在我的文件中不知何故添加了 Â。我不确定它是什么以及它是如何添加的。

12345A 210 CBCDEM

我想从文件中删除这个字符。我尝试了基本的 sed 命令将其删除但不成功。

  sed -i -e 's/\Â//g'

我还读到 dos2unix 可以完成这项工作,但不幸的是这也不起作用。假设它是十六进制字符,我也尝试使用十六进制值 sed -i 's/\xc2//g' 将其删除,但这也没有用

我真的很想了解这个角色是什么以及它是如何被添加的。此外,是否有可能删除文件中的所有此类字符。

添加编码细节:--

file test.txt 
test.txt: ISO-8859 text
echo $LANG
en_US.UTF-8

操作系统详情:--

uname -a
Linux vm-testmachine-001 3.10.0-693.11.1.el7.x86_64 #1 SMP Fri Oct 27 05:39:05 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux

问候。

【问题讨论】:

  • 文件是如何创建的?
  • 该文件被创建为从 Mongo 导出。 Mongo 没有这样的字符。
  • 当然。你能检查一下你的系统使用的编码和你的数据库使用的编码吗?
  • 尝试运行file <filename> 并将结果包含在您的问题中。 od -c <filename> | head 之类的东西也可能有用。我们需要更多信息。

标签: unix sed character-encoding


【解决方案1】:

看起来您在写入文件的程序(在ISO-8859 的某些部分)和读取文件的程序(假设它是UTF-8)之间存在编码不匹配。这是iconv 的教科书用例。事实上,手册页中的示例几乎完全适用于您的案例:

iconv -f iso-8859-1 -t utf-8 test.txt

iconv 是我见过的几乎所有 Unix 发行版上的 fairly standard 程序,所以在这里你应该没有任何问题。

基于您似乎以英语作为主要语言写作这一事实,您可能正在寻找iso-8859-1,这显然很受欢迎。

如果这不能解决您的问题,您可能需要为数据库的输出找到正确的编码。你可以这样做

iconv -l

获取可用于iconv 的编码列表,并使用适合您的编码。请记住,file 的输出说 ISO-8859 text 不是绝对的。在许多情况下,无法区分纯 ASCII 和 UTF-8 之类的东西。如果我没记错的话,file 使用基于文件中字符代码频率的启发式方法来确定编码。如果样本很小和/或模棱两可,很容易出错。

如果你想保存iconv 的输出并且你的版本支持-o 标志,你可以使用它。否则,请使用重定向,但要小心:

TMP=$(mktemp)
iconv -f iso-8859-1 -t utf-8 test.txt > "$TMP" && mv "$TMP" test.txt

【讨论】:

  • 一直报错 iconv: 不支持从 `ISO-8859' 转换
  • @user2854333。试试iso8859。您实际使用的是什么操作系统?请将其编辑到问题中。
  • iso8859 也不起作用。我做了 iconv -l 以获得支持的转换格式,似乎 iso-8859 不存在,我们需要 iso-8859-1 或类似的东西。
  • 我试过了,但字符仍然存在,虽然编码已经改变了。
  • @user2854333。 “不幸的是,它没有帮助”不是一个很有帮助的评论。我已经多次要求在 cmets 中提供有关您完全忽略的问题本身的更多信息。如果没有这些信息,我真的无法帮助你,所以在你提供之前,我已经添加了我的近距离投票。
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2010-11-19
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
相关资源
最近更新 更多