[英]Remove invalid non-ASCII characters in Bash
在Bash(在Ubuntu上)中,是否有一个命令可以删除无效的多字节(非ASCII)字符?
我已经尝试过perl -pe 's/[^[:print:]]//g'
但它也会删除所有有效的非ASCII字符。
如果需要,我可以使用sed
, awk
或类似的实用程序。
问题是Perl不会意识到您的输入是UTF-8。 它假定它在字节流上运行。 您可以使用-CI
标志来告诉它将输入解释为UTF-8。 并且,由于您的输出中将包含多字节字符,因此还需要告诉Perl将UTF-8写入标准输出中,您可以通过使用-CO
标志来实现。 所以:
perl -CIO -pe 's/[^[:print:]]//g'
如果要使用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字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.