如何利用bash中每行的首字母大写?

时间:2017-04-30 11:25:30

标签: linux bash sed uppercase capitalization

我正在寻找一个命令,将bash中每行的第一个字母大写。

其实我用过这个命令:

sed 's/^\(.\)/\U\1/'

但我需要使用另一个命令而不是" \ U"。

3 个答案:

答案 0 :(得分:6)

为什么你需要使用\U以外的其他东西?

您可以使用\u,只使用一个字母大写:

sed 's/./\u&/'

或者,使用参数扩展:

while read line ; do echo "${line^}" ; done

答案 1 :(得分:0)

将文件拆分为第一个字符/第二个字符,第一个字符在第一个字符上方,并将te列粘贴在一起。

paste -d "" <(cut -c1 inputfile| tr '[:lower:]' '[:upper:]') <(cut -c2- inputfile)

编辑:
如果要解析流中的输入(如mycommand | myscript.sh),原始解决方案将导致问题。我的解决方案想要解析输入两次。当您可以等到输入过程完成时,您可以将输出重定向到tmp文件

tmpfile=/tmp/myscript.wrk
# read input with cat
cat > ${tmpfile}
paste -d "" <(cut -c1 ${tmpfile}| tr '[:lower:]' '[:upper:]') <(cut -c2- ${tmpfile})
rm -f ${tmpfile} 2>/dev/null

您可以在命令行上尝试相同的操作。没有睡眠,第二次切割将找到一个空文件。当原始命令运行超过一秒时,1秒的睡眠将失败

mycommand | tee /tmp/dont_do_this | 
   cut -c1 | tr '[:lower:]' '[:upper:]' | 
   paste -d "" - <(sleep 1;cut -c2- /tmp/dont_do_this)

回顾上述解决方案将得出结论,您应该使用@choroba发布的解决方案。当教练说你应该使用[:lower:]就像问你是否要喝咖啡并补充说你应该通过鼻子喝它:可能但不是很好。
如果您真的想这样做,请尝试下一个解决方案:

mycommand | while read -r line; do
   printf "%s%s\n" $(tr '[:lower:]' '[:upper:]' <<< "${line:0:1}") "${line:1}"
done

答案 2 :(得分:-1)

这是一种很好的简单方法: sed -e's /^./ \ U&amp; /'yourfile