Sed用小写字母替换混合大小写的单词,同时保持所有大写单词不变

时间:2014-11-03 02:53:04

标签: regex bash unix sed

我的文件包含(推特)这样的推文:

GP 02\/14: POP LOH!!! ^^ Photo credits: @joleneqjm @ Marina Floating Platform

我需要将推文转换为小写以减少词汇量。但我不想将POP转换为pop,因为POP是首字母缩略词,具有特殊意义。

所以期望的输出是:

GP 02\/14: POP LOH!!! ^^ photo credits: @joleneqjm @ marina floating platform

有没有办法以单行方式使用sed或任何其他bash工具实现这一目标?

3 个答案:

答案 0 :(得分:0)

你可以试试下面的sed命令,

sed -r 's/\b([A-Z][a-z]+)/\L\1/g' file

OR

sed -r 's/\b([a-zA-Z]*([A-Z][a-z]|[a-z][A-Z])[A-Za-z]*)\b/\L\1/g' file

上面的sed命令将捕获以大写字母和后面的一个或多个小写字母开头的单词。然后将捕获的组内的字符转换为小写将为您提供所需的输出。

答案 1 :(得分:0)

这是一个awk解决方案。它会从6字段开始将所有内容更改为小写。

cat file
GP 02\/14: POP LOH!!! ^^ Photo credits: @joleneqjm @ A NICE Marina Floating Platform

awk '{for (i=6;i<=NF;i++) $i=tolower($i)}1' file
GP 02\/14: POP LOH!!! ^^ photo credits: @joleneqjm @ a nice marina floating platform

它会将包含单个字符I am的字词,包含全部大写NICE的字词和包含此GoPro的字词更改为:i amnice和{{1 }}

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/((\<[A-Z]+\>\W*)*)(\w+)/\1\L\3/g' file

这样就会留下大写单词和小写字样。