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

Perl: Remove all non-ascii characters except specific ones

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

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

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

编辑:

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

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

只需扩展要排除的字符以包括表情符号:

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 设置中)。

您可以像这样在 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