Perl:删除除特定字符之外的所有非ascii字符

时间:2015-03-22 07:09:13

标签: regex perl unicode regex-negation emoticons

我想从文本文件中删除除Unicode emoticons之外的所有非ASCII字符。我使用以下命令将删除所有非ASCII字符。

perl -i.bak -pe 's/[^[:ascii:]]//g'

是否可以修改此命令以排除表情符号?

编辑:

示例输入:Good morning! #Happy #StPatricksDay ♣♥

示例输出:Good morning! #Happy #StPatricksDay

2 个答案:

答案 0 :(得分:2)

您可以在Perl中指定范围,如下所示:

s='Good morning! #Happy #StPatricksDay ♣♥'

echo "$s" | perl -C -pe 's/[^[:ascii:]\x{1F600}-\x{1F64F}]+//g'
Good morning! #Happy #StPatricksDay 

Reference: Unicode block for emoticons

答案 1 :(得分:0)

只需扩展您要排除的字符即可包含表情符号:

perl -i.bak -pe 's/[^[:ascii:]\p{block:Emoticons}\N{U+2639}\N{U+263A}\N{U+263B}]//g'

修改

经过大量的讨论并尝试不同的开关后,我发现了一个与\ p {block ...}和\ N {U + xxxx}类型的正则表达式一起使用的组合。

 perl -CS -pe 's/[^[:ascii:]\p{block:emoticons}\N{U+2639}-\N{U+263B}]//g'

请注意,您的文字必须为utf-8才能生效(至少在我的cygwin设置中)。