在 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
不清楚如何区分后跟句点的一串字母是缩写还是只是句子的结尾。
我想使用 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
不清楚如何区分后跟句点的一串字母是缩写还是只是句子的结尾。