【问题标题】:Convert capitalized words only into lower case to cancels capitalization of nouns仅将大写单词转换为小写以取消名词的大写
【发布时间】:2019-06-15 06:26:25
【问题描述】:

给定:

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

我要获取:

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

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

*:首字母大写。

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

【问题讨论】:

  • 虽然有一个例子很好,但您必须更好地指定您的要求。 Hello 和 Welcome 与 North、USA 和 U.K 有何不同?
  • North Korea、USA 和 U.K 是包含多个大写字母的行。
  • 那么,如果第三行是StrIng(S和I都是大写),你的输出应该和输入一样吗?
  • 我认为是这样的:第一个字符大写,然后只有小写 => 将全部转换为小写。所以StrIng => StrIng, strIng = strIng, STRING => STRING, and String => string.
    我寻找一个取消大写的命令名词,而不是攻击首字母缩略词或故意怪异。

标签: awk sed grep nlp tr


【解决方案1】:

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

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

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

【讨论】:

  • 是的,但也需要包括线边界。
  • 这会改变修改行中的空白,这可能是不可取的。 $0=tolower(substr($0,1,1)) substr($0,2) 不会。此外,[A-Z] 在某些语言环境中会包含小写字母,最好使用字符类 [:upper:]。
  • 在[A-Z][^A-Z]+$ 中,* 会更好,因此单字符单词也会被覆盖 (A=>a)。目前确实没有涵盖。 @EdMorton 建议使用/^[[:upper:]][^[:upper:]]*$,以避免A-Z means "all upper and lower case letters except a". 的陷阱。最后,建议考虑空格和点的变体是明智的。
【解决方案2】:

sed 解决方案:

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

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

【讨论】:

  • 在某些语言环境中,字母的排序顺序是aAbBcC...zZ,因此A-Z 表示“除a 之外的所有大写和小写字母”。使用字符类/^[[:upper:]][^[:upper:]]*$ 来代替可移植性。
  • @EdMorton +1。你能把它也扩展到音译吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2015-09-04
  • 2020-02-17
相关资源
最近更新 更多