在Bash中(在Ubuntu上),是否有一个删除无效多字节(非ASCII)字符的命令?
我已尝试perl -pe 's/[^[:print:]]//g'
但它也删除了所有有效的非ASCII字符。
如果需要,我可以使用sed
,awk
或类似的实用程序。
答案 0 :(得分:3)
问题是Perl没有意识到你的输入是UTF-8;它假设它在一个字节流上运行。您可以使用-CI
标志告诉它将输入解释为UTF-8。而且,既然你的输出中有多字节字符,你还需要告诉Perl在写入标准输出时使用UTF-8,你可以使用-CO
来做旗。所以:
perl -CIO -pe 's/[^[:print:]]//g'
答案 1 :(得分:0)
如果您想要更简单的Perl替代方案,请尝试iconv
,如下所示:
iconv -c <<<$'Mot\x{fc}rhead' # -> 'Motrhead'
-f
的输入编码(例如-f UTF8
);使用-t
的输出编码(例如-t UTF8
) - 运行iconv -l
以查看所有支持的编码。-c
只是丢弃输入字符。在输入编码中无效;在示例中,\x{fc}
是ö
的单字节LATIN1(ISO8859-1)表示,在UTF8中无效(其中它表示为\x{c3}\x{b6}
)。注意(在OP发现评论后):如果您的输出仍包含乱码:
“ (问号)或(包含十六进制数字的方框)”
这意味着清理后的字符串包含 - 有效 - UTF-8字符,正在使用的字体不支持。