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

标签 sed utf-8 character-encoding removing-whitespace tr

我有一个包含空格字符的文件,无法使用 trsed 等命令行工具成功删除该字符。输入如下:

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

我希望输出看起来像:

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

尝试

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

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

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

仍然留下空间。 我将字符串转换为十六进制,看起来有问题的字符是 a0,但即使如此,结果也不是我所期望的: sed 's/\xa0//g' 产量

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

问题

[[:space:]] 字符类未捕获的空白字符是什么?我怎样才能删除它?

最佳答案

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

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

说明

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

关于sed - 无法使用 tr、sed 从字符串中删除空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62601431/

相关文章:

linux - 在 Linux 上显示不包含特定字符串的行

javascript - 使用 JavaScript 读取/写入文件时的字符编码

git - 在 git 存储库中为每个文件配置编码以正确输出 `git diff`

c++ - 为什么 C11 或 C++11 中没有 ASCII 或 UTF-8 字 rune 字?

Mysql 用对应的 ascii 替换所有特殊的 unicode 字符

PHP、MySQL、字符显示不正确。

javascript - 不同字符编码时从键盘搜索选项

linux - 在本地编辑文件的多行,然后多次重命名 - Linux

linux - 一个 sed diff 结果 :sed: -e expression #1, 字符 4:未终止的 `s' 命令

regex - sed 在字符串和最后一次出现的字符之间搜索和替换