用SED大写第一个字母

时间:2009-10-08 15:50:33

标签: linux bash unix sed

如何将单词的第一个字母替换为大写字母, e.g。

Trouble me
Gold rush brides

进入

Trouble Me
Gold Rush Brides

9 个答案:

答案 0 :(得分:63)

这一行应该这样做:

sed -e "s/\b\(.\)/\u\1/g"

答案 1 :(得分:21)

使用awk

awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1' file

输出结果为:

Trouble Me
Gold Rush Brides

答案 2 :(得分:11)

使用以下sed命令大写每个单词的第一个字母。

echo -e "Trouble me \nGold rush brides" | sed -r 's/\<./\U&/g'

输出

Trouble Me
Gold Rush Brides

-r开关告诉sed使用扩展正则表达式。 sed的说明然后告诉它“ s earch并替换”(开头的s)模式\<.使用模式\U& g ,即每个行中的所有实例(最后是g修饰符)。我们正在搜索的模式是\<.,它正在寻找word boundary\<),然后是any character.)。替换模式为\U&\U指示sed指向make the following text uppercase&指示a synonym for \0,指的是“匹配的所有内容” 。在这种情况下,“匹配的所有内容”正是.匹配的内容,因为字符边界未包含在匹配中(相反,它们是 anchors )。 .匹配的只是一个字符,所以这就是大写字母。

答案 3 :(得分:4)

我有撇号这样,解决了第一个解决方案......

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g"

Best Western Plus Bob'S Inn

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed "s/\( \|^\)\(.\)/\1\u\2/g"

Best Western Plus Bob's Inn

答案 4 :(得分:4)

sed的另一个较短版本:

sed -e "s/\b./\u\0/g"

答案 5 :(得分:4)

我知道你说的是sed,但对于shell脚本来说,对我来说最容易和最灵活的一个就是使用大多数系统中都可用的Python:

$ echo "HELLO WORLD" | python3 -c "import sys; print(sys.stdin.read().title())"
Hello World

例如:

$ lorem | python3 -c "import sys; print(sys.stdin.read().title())"
Officia Est Omnis Quia. Nihil Et Voluptatem Dolor Blanditiis Sit Harum. Dolore Minima Suscipit Quaerat. Soluta Autem Explicabo Saepe. Recusandae Molestias Et Et Est Impedit Consequuntur. Voluptatum Architecto Enim Nostrum Ut Corrupti Nobis.

您还可以使用strip()之类的内容删除空格,或capitalize()

$ echo "  This iS mY USER ${USER}   " | python3 -c "import sys; print(sys.stdin.read().strip().lower().capitalize())"
This is my user jenkins

答案 6 :(得分:1)

到目前为止,提出的sed解决方案仅在原始文本为小写时才有效。尽管可以使用tr '[[:upper:]]' '[[:lower:]]'将输入规范化为小写,但采用多合一sed解决方案可能会很方便:

sed 's/\w\+/\L\u&/g'

这将匹配单词(\w表示单词字符,\+至少一个,直到下一个非单词字符),小写字母直到结尾(\L) >但是将每个(\u)匹配表达式(g)上的下一个(即第一个)字符(&)大写。

[Credits]

答案 7 :(得分:0)

通过 tr 使用 sed

name="athens"
echo $name | sed -r "s/^[[:alpha:]]/$(echo ${name:0:1} | tr [[:lower:]] [[:upper:]])/"

答案 8 :(得分:0)

使用bash(不使用sed,所以离主题有点远):

msg="this is a message"
for word in $msg
do
   echo -n ${word^} ""
done

This Is A Message