从Bash变量中删除非打印字符

17

我有一个变量$a。这个变量包含一些非打印字符(回车符^M)。

>echo $a
some words for compgen
>a+="END"
>echo $a
ENDe words for compgen
我该如何删除那个字符? 我知道echo "$a"可以正确显示它,但在我的情况下这并不是一个解决方案。
5个回答

35
你可以使用tr
tr -dc '[[:print:]]' <<< "$var"

$var中的非打印字符删除。

$ foo=$'abc\rdef'
$ echo "$foo"
def
$ tr -dc '[[:print:]]' <<< "$foo"
abcdef
$ foo=$(tr -dc '[[:print:]]' <<< "$foo")
$ echo "$foo"
abcdef

10
注意:这也会删除umlauts和许多其他实际可打印的字符。 - Chiru
5
通过这个来自 https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix 的小技巧,我得到了更好的结果:tr -cd '\11\12\15\40-\176' - qneill
@Chiru,这取决于您的操作系统和当前语言环境。如果将LC_CTYPE设置为支持umlauts的字符集,并且操作系统提供了多字节感知工具,则它们将得以保存。 - Charles Duffy

11

要仅从a中删除尾部回车符,请使用

a=${a%$'\r'}

4

我试图通过libnotify发送包含不可打印字符的通知。现有的解决方案对我来说并不完全适用(使用tr白名单过滤字符可以工作,但会剥离任何多字节字符)。

以下是经过测试有效的解决方案:

message=$(iconv --from-code=UTF-8 -c <<< "$message")

3
作为仅使用shell内置命令的“tr”方法的等效方法:
cleanVar=${var//[![:print:]]/}

如果合适,您可以使用字符类来替换:print:


0
tr -dc '[[:alpha:]]'

将字符串翻译为仅包含字母字符(如果需要的话)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接