如何在文本文件中查找和删除表情符号? [英] How do I find and remove emojis in a text file?

查看:0
本文介绍了如何在文本文件中查找和删除表情符号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从我主要使用sed和一些Perl命令解析的文本文件中删除所有emoji,最好将它们存储在一个单独的文件中,但这不是必需的。

我能用bash或Perl轻松做到这一点吗?或者我应该使用其他语言?

编辑:感谢赛勒斯和巴玛为我指明了正确的方向,指向this question。然而,它并没有告诉我如何从文本文件中仅删除表情符号。他们使用bash行:

grep -P "[x{1f300}-x{1f5ff}x{1f900}-x{1f9ff}x{1f600}-x{1f64f}x{1f680}-x{1f6ff}x{2600}-x{26ff}x{2700}-x{27bf}x{1f1e6}-x{1f1ff}x{1f191}-x{1f251}x{1f004}x{1f0cf}x{1f170}-x{1f171}x{1f17e}-x{1f17f}x{1f18e}x{3030}x{2b50}x{2b55}x{2934}-x{2935}x{2b05}-x{2b07}x{2b1b}-x{2b1c}x{3297}x{3299}x{303d}x{00a9}x{00ae}x{2122}x{23f3}x{24c2}x{23e9}-x{23ef}x{25b6}x{23f8}-x{23fa}]"  myflie.txt | more

这使我的所有都包含一个表情符号。

grep -Pv将从输入中删除这些行

grep -Po将只返回表情符号

grep -Pov不返回任何内容。

有人知道如何从文本中删除这些特定字符吗?

注意:我知道this question,但我的文本文件根本没有格式化。表情符号与文本的其余部分混合在一起。

Perl

2020更新:推荐答案v5.32使用Unicode13并支持使用emoji处理。您可以简单地使用Emoji属性:

#!perl
use v5.32;
use utf8;
use open qw(:std :utf8);

while( <<>> ) {  # double diamond (from v5.26) 
    s/p{Emoji}//g;
    print;
    }

作为一行程序,它变成:

% perl -CS -pe 's/p{Emoji}//g' file1 file2 ...

旧版Perl的字符类

在Perl中,删除表情符号可以很容易。就其核心而言,这非常接近于您所做的sed。更新任务的模式和其他详细信息:

#!perl
use utf8;
use open qw(:std :utf8);

my $pattern = "[x{1f300}-x{1f5ff}x{1f900}-x{1f9ff}x{1f600}-x{1f64f}x{1f680}-x{1f6ff}x{2600}-x{26ff}x{2700}-x{27bf}x{1f1e6}-x{1f1ff}x{1f191}-x{1f251}x{1f004}x{1f0cf}x{1f170}-x{1f171}x{1f17e}-x{1f17f}x{1f18e}x{3030}x{2b50}x{2b55}x{2934}-x{2935}x{2b05}-x{2b07}x{2b1b}-x{2b1c}x{3297}x{3299}x{303d}x{00a9}x{00ae}x{2122}x{23f3}x{24c2}x{23e9}-x{23ef}x{25b6}x{23f8}-x{23fa}]";

while( <DATA> ) {  # use <> to read from command line
    s/$pattern//g;
    print;
    }

__DATA__
Emoji at end 😀
🗿 Emoji at beginning
Emoji 🙏 in middle

UTS #51 mentions an Emoji property,但未在perluniprop中列出。如果有这样的东西,您将简化删除该属性的所有内容:

while( <DATA> ) {
    s/p{Emoji}//g;
    print;
    }

Emoticon属性,但这不包括您的字符类。我还没有查看它是否会与UTS#51中的Emoji属性相同。

用户定义的Unicode属性

您可以通过定义一个子例程来创建your own properties,该子例程的开头是InIs,后跟您选择的属性名称。该子例程返回一个可能有多行的字符串,其中每行要么是一个十六进制码数字,要么是由水平空格分隔的两个十六进制码数字。所有这些内容中的任何字符都是您的财产的一部分。

下面是与用户定义Unicode属性相同的字符类。请注意,我使用squiggly heredoc,主要是因为我可以在本地编写带有前导空格的程序,以便可以直接粘贴到StackOverflow中。不过,IsEmoji中的行不能有前导空格,但缩进的here文档可以解决这一问题:

#!perl
use v5.26; # for indented heredoc
use utf8;
use open qw(:std :utf8);

while( <DATA> ) {  # use <> to read from command line
    s/p{IsEmoji}//g;
    print;
    }

sub IsEmoji { <<~"HERE";
1f300 1f5ff
1f900 1f9ff
1f600 1f64f
1f680 1f6ff
2600 26ff
2700 27bf
1f1e6 1f1ff
1f191 1f251
1f004 1f0cf
1f170 1f171
1f17e 1f17f
1f18e
3030
2b50
2b55
2934 2935
2b05 2b07
2b1b 2b1c
3297
3299
303d
00a9
00ae
2122
23f3
24c2
23e9 23ef
25b6
23f8 23fa
HERE
}

__DATA__
Emoji at end 😀
🗿 Emoji at beginning
Emoji 🙏 in middle

您可以将其放在一个模块中:

# IsEmoji.pm
sub IsMyEmoji { <<~"HERE";
1f300 1f5ff
...  # all that other stuff too
23f8 23fa
HERE
}

1;

现在您可以在单行中使用它(-I.将当前目录添加到模块搜索路径,-M表示要加载的模块):

$ perl -CS -I. -MIsEmoji -pe 's/p{IsEmoji}//g' file1 file2

除此之外,您还需要在一行程序中使用长字符类。

这篇关于如何在文本文件中查找和删除表情符号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆