【问题标题】:wrap/replace sentences in Greek encoding using sed使用 sed 以希腊语编码换行/替换句子
【发布时间】:2016-06-04 13:08:20
【问题描述】:

我有一个 UTF8 编码的 txt 文件,其中包含(大部分)拉丁字母单词(包括重音字母)和(少数)希腊语单词(包括变音符号)。

我想找到所有希腊语“句子”(即希腊字母表中的单词,用空格和/或常用标点符号分隔,但没有拉丁字符),并用相同的句子替换那些,但包裹在 \greektext {...} LaTeX 命令。

例如Пάτριος πολιτεία 应替换为 \greektext{Пάτριος πολιτεία}

那么基本的问题是,是否可以使用 sed 选择希腊词组,即希腊语“句子”,如上定义。

【问题讨论】:

    标签: bash sed utf-8


    【解决方案1】:

    我认为像这样的正则表达式可能对你有好处:

    /([\u0370-\u03FF\u0400-\u04FF]+\s+[\u0370-\u03FF\u0400-\u04FF]+)+/
    

    \u0370-\u03FF 是希腊语和科普特语块,\u0400-\u04FF 是西里尔语块。

    对你所有指定的字符执行charinfo,这些块将覆盖你:

    % charinfo Пάτριος πολιτεία
    U+041F CYRILLIC CAPITAL LETTER PE [Lu]
    U+03AC GREEK SMALL LETTER ALPHA TONOS [Ll]
    U+03C4 GREEK SMALL LETTER TAU [Ll]
    U+03C1 GREEK SMALL LETTER RHO [Ll]
    U+03B9 GREEK SMALL LETTER IOTA [Ll]
    U+03BF GREEK SMALL LETTER OMICRON [Ll]
    U+03C2 GREEK SMALL LETTER FINAL SIGMA [Ll]
    U+03C0 GREEK SMALL LETTER PI [Ll]
    U+03BF GREEK SMALL LETTER OMICRON [Ll]
    U+03BB GREEK SMALL LETTER LAMBDA [Ll]
    U+03B9 GREEK SMALL LETTER IOTA [Ll]
    U+03C4 GREEK SMALL LETTER TAU [Ll]
    U+03B5 GREEK SMALL LETTER EPSILON [Ll]
    U+03AF GREEK SMALL LETTER IOTA TONOS [Ll]
    U+03B1 GREEK SMALL LETTER ALPHA [Ll]
    

    但是 AFAIK sed 不能很好地处理多字节字符。不过下面的 Perl 脚本可以工作:

    #!/usr/bin/perl -p
    use open qw(:std :utf8);
    s/([\x{0370}-\x{03FF}\x{0400}-\x{04FF}]+\s+[\x{0370}-\x{03FF}\x{0400}-\x{04FF}]+)+/\\greektext{$&}/u'
    

    及用法:

    perl my_script.pl < my_input > my_output
    

    【讨论】:

    • sed: -e 表达式 #1, char 71: 无效范围结束
    • 当然我做到了(非常感谢!),并且我尝试使用:#!/bin/sh sed -i "s/([\u0370-\u03FF\u0400- \u04FF]+\s+[\u0370-\u03FF\u0400-\u04FF]+)+/\\\textgreek\{&\}/g" $1 导致“无效范围结束”错误消息:-(跨度>
    • 替换单个字符(但以两个字节的十六进制组合形式给出)虽然有效: sed -i "s/\xce\xb9/\\\textgreek\{&\}/g" $1 What我还不能定义给定字符范围的单词,即使以十六进制表示形式给出。
    • 使用 sed -i "s/[\xce\x91-\xcf\x8e]/\\\textgreek\{&\}/ 替换(方便大)范围内的单个字符g" $1 但不是文字。
    • ... 最多可以放大到 \xce\x86-\xcf\x9c (两端的范围更广会产生 Invalid collat​​ion character 错误)
    猜你喜欢
    • 2012-04-30
    • 2017-03-15
    • 2021-08-07
    • 2023-03-23
    • 2014-02-23
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2023-01-31
    相关资源
    最近更新 更多