在 AWK 中以不同的方式替换同一字符的多次出现

Replace several occurences of the same character in a different way in AWK

我想使用 AWK 替换 csv 文件中的几个字符,具体取决于它们周围的字符。

例如这一行:

"Example One; example one; EXAMPLE ONE; E. EXAMPLE One"

我想将所有大写 "E" 替换为 "EE",如果它们在一个只使用大写的单词中,如果它们在一个大写的单词中,我想用 "Ee" 替换和小写字母或缩写(如 E.,它是一个地址文件,因此在任何情况下这也可能是句子的结尾)所以它应该如下所示:

"Eexample One; example one; EEXAMPLEE ONEE; Ee. EEXAMPLEE One"

现在我试过的是:

{if ([=10=] ~/E[A-Z]+/)
    [=10=] = gensub(/E/,"EE","g",[=10=])
else if ([=10=] ~/[A-Z]E/)
    [=10=] = gensub(/E/,"EE","g",[=10=])
else
    [=10=] = gensub(/E/,"Ee","g",[=10=])
}

这在大多数情况下都可以正常工作,但是对于包含多个 "E" 的行(或字段),我希望其中一个被替换为 "Ee" 和一个作为 "E. EXAMPLE One" 中的 "EE",它与 "EXAMPLE" 中的 E 匹配,只是用 "EE" 替换该行中的所有 "E"。

有更好的方法吗?我可以在 gensub 中以某种方式使用 if 吗?

ps:希望这是有道理的,我刚刚开始学习编程的基础知识!

$ cat tst.awk
{
    head = ""
    tail = [=10=]
    while ( match(tail,/[[:alpha:]]+\.?/) ) {
        tgt = substr(tail,RSTART,RLENGTH)
        add = (tgt ~ /^[[:upper:]]+$/ ? "E" : "e")
        gsub(/E/,"&"add,tgt)
        head = head substr(tail,1,RSTART-1) tgt
        tail = substr(tail,RSTART+RLENGTH)
    }
    print head tail
}

$ awk -f tst.awk file
Eexample One; example one; EEXAMPLEE ONEE; Ee. EEXAMPLEE One

不清楚如何区分后跟句点的一串字母是缩写还是只是句子的结尾。