删除/替换特殊字符 ° 时出现问题

删除/替换特殊字符 ° 时出现问题

我似乎无法消除这个°符号。

我努力了:

  sed 's/°//g' file.txt

  sed 's/\°//g' file.txt

但两者都不起作用。

我运行的是 ubuntu 16。

该符号似乎没有被检测到 - 我确实复制并粘贴了。

这也没有做任何事情来找到符号

  sed '/°/!d' file.txt

有什么建议么?

答案1

第一个应该已经可以工作了。该符号虽然是非 ASCII 字符,但没有特殊含义。不需要\,不要投机取巧,如果它应该在没有 的情况下工作\,那就让它以这种方式工作!就像你会尝试一样

sed 's/ő//g'

在这种情况下,最可能的原因是:

  1. 编码问题。检查文件使用哪种编码 ( file -szL file.txt),以及您使用哪种编码 ( echo $LANG)。这是因为“ °”在不同的编码中可以有不同的字节序列。最好都是 utf-8 格式。扩展:Ubuntu 16 默认情况下对 utf-8 友好,顶多在仅限美国的情况下,很老的,不断升级的系统,我能想象这样的编码问题吗?更现实的是,您的文本文件不是 utf-8 格式。命令file会告诉你。
  2. 您可以过滤一个相似的角色,但不是确切的角色。在一个不太古老的 utf-8 系统上有数千个可显示的字符,其中许多是像这样的特殊象形文字,它们中的任何一个看起来都非常相似。在这种情况下,解决方案也很简单:cat文件,并将字形复制粘贴到命令行中。

如果您按照这些操作,95% 的人就发现并解决了这一点上的问题。剩下的就是10%的情况。

如果这些都不起作用,您可以在最深的字节级别上进行调试。对于你的情况我会这样做:

  1. 我会首先启动这个sed命令,但我会给它/dev/zero作为源:sed 's/°//g' </dev/zero >/dev/null。这将导致它将sed在无限循环中工作,在无限长的零字节流上工作,并且不会当场退出。所以,你可以调试它。
  2. 使用 ctrl/z 暂停其执行。
  3. 使用 检查其 pid pidof sed。您将获得最多 5 位整数。
  4. 使用 ahexcat /proc/12345/cmdline您将能够看到该 sed 命令行的字节级数据。
  5. °您可以通过执行相同的操作来检查“”的字节级编码hexcat file.txt
  6. 两者必须匹配。如果他们不这样做,则图片中存在一些邪恶,请尝试(2)或提出一个新问题。

许多 Linux 发行版只是hexcat从发行版中删除了他们最有用的工具之一,因为他们认为没有人使用它。但据我所知,还有其他一些工具,也许xxd就是其中之一。如果您无法使用任何内容进行六角转储,请在新问题中提出。

答案2

好吧,试试这个简单的方法:

echo "°" | xxd

这将返回类似以下内容:

0000000: c2b0 0a

你需要代码c2b0,我猜0a是换行符。

然后尝试:

sed -e 's/\xc2\xb0//' file.txt

希望有效。

相关内容