我想使用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
不过,目前还不清楚如何区分一个字母串,后面跟着一个句号作为缩写或只是句子的结尾。