以不同的方式替换AWK中出现的多个相同字符



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

例如:

"示例一;示例一;实例一;E.实例一"

如果所有大写字母"E"都在一个只使用大写字母的单词中,我想用"EE"替换它们;如果它们在一个有大小写字母或缩写的单词中(就像E.一样,它是一个地址文件,所以没有可能是句子结尾的情况),我想把它们替换为"EE",所以它应该是这样的:

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

现在我尝试的是:

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

这在大多数情况下都很好,但对于包含多个"E"的行(或字段),我希望其中一个被替换为"Ee",另一个像"E.示例一"中的"Ee",它匹配"示例"中的E,并将该行中的所有"E"都替换为"Ee"。

有更好的方法吗?我可以在发电站内使用if吗?

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

$ cat tst.awk
{
    head = ""
    tail = $0
    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

不过,目前还不清楚如何区分一个字母串,后面跟着一个句号作为缩写或只是句子的结尾。

最新更新