仅将大写单词转换为小写以取消名词的大写

Convert capitalized words only into lower case to cancels capitalization of nouns

给定:

$ cat input
Hello
Welcome
strIng
North Korea
USA
U.K.

我要获取:

$ cat output
hello
welcome
strIng
North Korea
USA
U.K.

如何将大写单词*仅转换为小写?

*:第一个字母大写。

注意:我正在寻找一个取消名词大写的命令,同时不攻击首字母缩略词和奇怪的单词。

像这样的内容将涵盖示例输入,但不确定它是否包含所有其他隐含条件

$ awk '/^[A-Z][^A-Z]+$/{=tolower(substr(,1,1)) substr(,2)}1' file
hello
welcome
strIng
North Korea
USA
U.K.

如果第一个字符匹配大写字母而任何后续字符都不是,则将第一个字符转换为小写字母。

一个sed解决方案:

sed '/^[A-Z][^A-Z]*$/ {
/^./y/ABCEDEFGHIJKLMNOPQRSTUVWXYZ/abcedefghijklmnopqrstuvwxyz/
}' input.txt > output.txt

已测试并确认适用于您的示例。修改以适用于重音字符(不确定 awk 的 toupper 对它们的处理效果如何)。