我有一个变量$a
。这个变量包含一些非打印字符(回车符^M)。
>echo $a
some words for compgen
>a+="END"
>echo $a
ENDe words for compgen
我该如何删除那个字符?
我知道echo "$a"
可以正确显示它,但在我的情况下这并不是一个解决方案。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
要仅从a
中删除尾部回车符,请使用
a=${a%$'\r'}
我试图通过libnotify发送包含不可打印字符的通知。现有的解决方案对我来说并不完全适用(使用tr
白名单过滤字符可以工作,但会剥离任何多字节字符)。
以下是经过测试有效的解决方案:
message=$(iconv --from-code=UTF-8 -c <<< "$message")
cleanVar=${var//[![:print:]]/}
如果合适,您可以使用字符类来替换:print:
。
tr -dc '[[:alpha:]]'
将字符串翻译为仅包含字母字符(如果需要的话)
tr -cd '\11\12\15\40-\176'
。 - qneillLC_CTYPE
设置为支持umlauts的字符集,并且操作系统提供了多字节感知工具,则它们将得以保存。 - Charles Duffy