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

无法使用tr、sed从字符串中删除空白,sed,utf-8,character-encoding,removing-whitespace,tr,Sed,Utf 8,Character Encoding,Removing Whitespace,Tr,我有一个包含空白字符的文件,我无法使用命令行工具(如tr或sed)成功删除该字符。以下是输入: 2,  78 ,, 1 6, 74, ,1 我希望输出像这样: 2,78,,1 6,74,,1 尝试 如果我尝试tr-d“[:space:]结果是2,78,16,74,1,它会留下一个空格字符并删除换行符 如果我尝试sed的//[:space:]//g',结果是 2, 78,,1 6,74,,1 这仍然留下了空间。 我将字符串转换为十六进制,似乎有问题的字符是a0,但即使如此,结果也不是

我有一个包含空白字符的文件,我无法使用命令行工具(如
tr
sed
)成功删除该字符。以下是输入:

2,  78  ,, 1
6,    74, ,1
我希望输出像这样:

2,78,,1
6,74,,1
尝试

如果我尝试
tr-d“[:space:]
结果是
2,78,16,74,1
,它会留下一个空格字符并删除换行符

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

2, 78,,1
6,74,,1
这仍然留下了空间。 我将字符串转换为十六进制,似乎有问题的字符是
a0
,但即使如此,结果也不是我所期望的:
sed's/\xa0//g'

2, �78  ,, 1
6,    74, ,1
问题

[[:space:]
字符类未捕获的空白字符是什么?如何删除它?

是一个UTF-8编码的非中断空格,具有十六进制表示形式
\xc2\xa0
。您可以使用

sed -E 's/[[:space:]]|\xc2\xa0//g'
解释

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

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

$ printf 'foo\xc2\xa0bar\n' > file
$ cat file
foo bar
$ tr -dc '[:print:]' < file
foobar$
$printf'foo\xc2\xa0bar\n'>文件
$cat文件
富吧
$tr-dc'[:print:][file
福巴$

但是我注意到等价物在GNU sed或GNU awk和idk中不起作用,原因是。

这不适用于多行输入,因为它会删除换行符。对于单行输入,我同意可以链接
tr
,如
tr-dc'[:print:'| tr-d'[:space:'