无法使用 tr、sed 从字符串中删除空格

Unable to delete whitespace from string with tr, sed

我有一个包含白色 space 字符的文件,我无法使用 trsed 等命令行工具成功删除该字符。这是输入:

2,  78  ,, 1
6,    74, ,1

我希望输出看起来像:

2,78,,1
6,74,,1

尝试次数

如果我尝试 tr -d "[[:space:]] 结果是 2, 78,,16,74,,1 留下 space 字符并删除换行符。

如果我尝试 sed 's/[[:space:]]//g' 结果是

2, 78,,1
6,74,,1

还剩下 space。 我将字符串转换为十六进制,似乎有问题的字符是 a0,但即便如此,结果也不是我所期望的: sed 's/\xa0//g' 产量

2, �78  ,, 1
6,    74, ,1

问题

没有被 [[:space:]] 字符 class 抓住的白色 space 字符是什么?我怎样才能删除它?

offending character 是 UTF-8 编码的不间断 space,十六进制表示法 \xc2\xa0。您可以使用

删除所有 space,包括不间断的 space
sed -E 's/[[:space:]]|\xc2\xa0//g'

说明

  • -E 打开扩展正则表达式以允许 | 表示逻辑 OR
  • 's/pattern/replacement/' 用替换文本(在本例中为空字符串)替换模式匹配,/g 每行多次重复模式替换
  • [[:space:]] 匹配大多数白色space 字符,包括 space 和制表符
  • \xc2\xa0 是 UTF-8 不间断 space
  • 的十六进制代码

您要删除的字符是不可打印的字符(即不在 [:print:] 字符 class 中的字符),而不仅仅是 [:space:] 中的字符字符 class:

$ printf 'foo\xc2\xa0bar\n' > file
$ cat file
foo bar
$ tr -dc '[:print:]' < file
foobar$

但我注意到等效项在 GNU sed 或 GNU awk 和 idk why 中不起作用。