我正在寻找一个命令,将bash中每行的第一个字母大写。
其实我用过这个命令:
sed 's/^\(.\)/\U\1/'
但我需要使用另一个命令而不是" \ U"。
答案 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