无法使用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:]
是UTF-8非中断空间的十六进制代码\xc2\xa0
[: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:'