【问题标题】:Unable to delete whitespace from string with tr, sed无法使用 tr、sed 从字符串中删除空格
【发布时间】:2020-10-17 10:48:26
【问题描述】:

我有一个包含空格字符的文件,我无法使用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:]] 字符类捕获的空白字符是什么?如何删除?

【问题讨论】:

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


    【解决方案1】:

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

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

    说明

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这不适用于多行输入,因为它会删除换行符。对于单行输入,我同意您可以链接tr,如tr -dc '[:print:]' | tr -d '[:space:]'
      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      相关资源
      最近更新 更多