一个人将如何使用sed
或另一种工具来删除除特定多字节范围之外的所有字符?
例如,该范围\xd8\xa0 - \xd9\x8a
涵盖以 UTF-8 编码的阿拉伯字符。这是我在使用 sed 时天真的充满希望的尝试:
$ echo "Peace be upon you. السلام عليكم. שלום עליכם. Paz sobre vosotros." | sed -n -e 's|[^\xd8\xa0-\xd9\x8a]||p'
sed: -e expression #1, char 25: Invalid range end
理解sed
了多字节字符,那应该给我们留下字符串:
السلام عليكم
我考虑过使用iconv
转换为一些特定于阿拉伯语的编码,使用sed
,然后转换回来。然而,我正在做的工作并不简单,比如我可能想同时保留阿拉伯语和希伯来语,所以如果可能的话,我想在整个过程中将所有内容都保存在 UTF-8 中。
如果sed
不能使用多字节字符,我应该使用什么?我已经搜索了这两个sed
和perl
解决方案,但没有运气。
请注意,我尝试向UTF-8
问题添加标签,但 unix.SE 将其更改为Unicode
标签。这里没有 Unicode,这些是存储在磁盘上的编码字符串。我认为应该有一个单独的UTF-8
标签。
您可以在 Perl中使用Unicode 属性:
-CIO
告诉 Perl 输入和输出是 UTF-8 编码的。\P{...}
是负属性匹配,\p{...}
将是正匹配。使用Raku(以前称为 Perl_6)
示例输入(OP 的文本保存为单行文件):
提取阿拉伯语脚本:
提取希伯来语脚本:
提取拉丁文字:
Raku 为 Unicode 提供高级支持,它的正则表达式引擎已经发展成为一个有能力的“语法分析器”。请参阅下面的链接。请注意,如果不匹配,上面的代码将返回空行。如果您只想匹配元素/行,您可以简单地添加对
$/
(或$<>
)匹配变量的条件调用:最后,您可以通过插入字符来搜索 Unicode 属性的否定
!
。+
您还可以使用和/或从所需的字符类中添加(甚至减去)-
。 [注意下面的附加正则表达式原子:Z
(空白)。为了完整起见,下面的代码同时显示了+
和!
参数——尽管 a-
可能在实践中起作用]:https://docs.raku.org/language/unicode
https://docs.raku.org/language/unicode#index-entry-UTF-8_Clean-8
https://stackoverflow.com/a/66540269/7270649