去除“不寻常”的 unicode 字符
在您提到的评论中,您希望在保留希腊字符的同时阻止控制字符,因此下面的 tr 解决方案不适合。一种解决方案是sed
提供 unicode 支持,并且它们的[[:alpha:]]
类也匹配 ascii 之外的字母字符。您首先需要设置LC_CTYPE
以指定哪些字符都属于该[[:alpha:]]
范围。对于带元音变音的德语,例如
LC_CTYPE=de_DE.UTF-8
然后你可以用sed
它来去掉所有不是字母或标点符号的东西:
sed 's/[^[:alpha:];\ -@]//g' < junk.txt
\ -@
作用:它匹配空格和之间的 ascii 范围内的所有字符@
(参见ascii 表。Sed有一个[[:punct:]]
类,但不幸的是这也匹配了很多垃圾,所以\ -@
需要。
您可能需要玩一点LC_CTYPE
,将其设置为utf-8
只有我可以匹配希腊字符,但不能匹配日语。
如果你只关心ascii
如果您只关心常规 ascii 字符,您可以使用tr
:首先将文件转换为“每个字符一个字节”编码,因为tr
不理解多字节字符,例如使用iconv
.
然后,我建议您使用白名单方法(与您在问题中使用的黑名单方法相反),因为说明您想要保留的内容比您想要过滤掉的内容要容易得多。
这个命令应该这样做:
iconv -c -f utf-8 -t latin1 < junk.txt | tr -cd '\11\12\40-\176'
这条线。。
- 转换为 latin1 (每个字符一个字节)并忽略代码点 127 以上的所有字符(这是特殊字符,但请注意,这也会去除您可能想要保留的语言中的变音符号或特殊字符之类的东西!)
- 删除此白名单之外的所有字符:
\11\12\40-\176
. 那里的数字是八进制的。看看这个 ascii 表。\11
是tab
,\12
是回车。\40-\176
是所有通常被认为是“正常”的字符