无法使用 tr、sed 从字符串中删除空格
Unable to delete whitespace from string with tr, sed
我有一个包含白色 space 字符的文件,我无法使用 tr
或 sed
等命令行工具成功删除该字符。这是输入:
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 中不起作用。
我有一个包含白色 space 字符的文件,我无法使用 tr
或 sed
等命令行工具成功删除该字符。这是输入:
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
。您可以使用
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 中不起作用。