我正在尝试从我主要使用 sed 和一些 perl 命令解析的文本文件中删除所有表情符号,并且最好将它们存储在一个单独的文件中,但这不是必需的。
我可以用 bash 或 perl 轻松做到这一点吗?还是我应该使用另一种语言?
编辑:感谢 Cyrus 和 Barmar 为我指出正确的方向,解决这个问题。但是,它没有告诉我如何仅从文本文件中删除表情符号。他们使用 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
Run Code Online (Sandbox Code Playgroud)
这让我得到了包含表情符号的所有行。
grep -Pv 将从输入中删除这些行,
grep -Po 将只返回表情符号,
grep -Pov 什么都不返回。
有谁知道如何从文本中删除这些特定字符?
注意:我知道这个问题,但我的文本文件根本没有格式化。表情符号与文本的其余部分混合在一起。
2020 更新:Perl v5.32 使用 Unicode 13 并支持多个处理表情符号的属性。您可以简单地使用该Emoji属性:
#!perl
use v5.32;
use utf8;
use open qw(:std :utf8);
while( <<>> ) { # double diamond (from v5.26)
s/\p{Emoji}//g;
print;
}
Run Code Online (Sandbox Code Playgroud)
作为单行,这变成:
% perl -CS -pe 's/\p{Emoji}//g' file1 file2 ...
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
UTS #51 提到了一个 Emoji 属性,但它没有在perluniprop 中列出。如果有这样的事情,您可以简化删除具有该属性的任何内容:
while( <DATA> ) {
s/\p{Emoji}//g;
print;
}
Run Code Online (Sandbox Code Playgroud)
有Emoticon属性,但这不包括您的角色类。我还没有看它是否与 UTS #51 中的 Emoji 属性相同。
您可以通过定义以 is 开头或后跟您选择的属性名称的子例程来创建自己的属性。该子例程返回一个潜在的多行字符串,其中每一行是单个十六进制代码编号或由水平空白分隔的两个十六进制代码编号。所有这些中的任何字符都是您财产的一部分。InIs
这是与用户定义的 Unicode 属性相同的字符类。请注意,我使用了波浪形的 heredoc,主要是因为我可以在本地用前导空格编写程序,这样我就可以直接粘贴到 StackOverflow 中。IsEmoji但是,in 中的行不能有前导空格,但缩进的 heredoc 会照顾到这一点:
#!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
Run Code Online (Sandbox Code Playgroud)
你可以把它放在一个模块中:
# IsEmoji.pm
sub IsMyEmoji { <<~"HERE";
1f300 1f5ff
... # all that other stuff too
23f8 23fa
HERE
}
1;
Run Code Online (Sandbox Code Playgroud)
现在您可以在一行中使用它(-I.将当前目录添加到模块搜索路径并-M表示要加载的模块):
$ perl -CS -I. -MIsEmoji -pe 's/\p{IsEmoji}//g' file1 file2
Run Code Online (Sandbox Code Playgroud)
除此之外,您还被困在单行中的长字符类中。
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |